django-rest-framework serializer를 사용하여 외부 키 값을 검색하는 중
저는 장고레스트 프레임워크를 사용하여 API를 만들고 있습니다.다음과 같은 모델이 있습니다.
class Category(models.Model):
name = models.CharField(max_length=100)
def __unicode__(self):
return self.name
class Item(models.Model):
name = models.CharField(max_length=100)
category = models.ForeignKey(Category, related_name='items')
def __unicode__(self):
return self.name
범주에 대한 직렬화 프로그램을 만들려면 다음을 수행합니다.
class CategorySerializer(serializers.ModelSerializer):
items = serializers.RelatedField(many=True)
class Meta:
model = Category
그리고 이것은 나에게 다음을 제공할 것입니다.
[{'items': [u'Item 1', u'Item 2', u'Item 3'], u'id': 1, 'name': u'Cat 1'},
{'items': [u'Item 4', u'Item 5', u'Item 6'], u'id': 2, 'name': u'Cat 2'},
{'items': [u'Item 7', u'Item 8', u'Item 9'], u'id': 3, 'name': u'Cat 3'}]
Item serializer에서 그 반대를 얻으려면 어떻게 해야 합니까?
[{u'id': 1, 'name': 'Item 1', 'category_name': u'Cat 1'},
{u'id': 2, 'name': 'Item 2', 'category_name': u'Cat 1'},
{u'id': 3, 'name': 'Item 3', 'category_name': u'Cat 1'},
{u'id': 4, 'name': 'Item 4', 'category_name': u'Cat 2'},
{u'id': 5, 'name': 'Item 5', 'category_name': u'Cat 2'},
{u'id': 6, 'name': 'Item 6', 'category_name': u'Cat 2'},
{u'id': 7, 'name': 'Item 7', 'category_name': u'Cat 3'},
{u'id': 8, 'name': 'Item 8', 'category_name': u'Cat 3'},
{u'id': 9, 'name': 'Item 9', 'category_name': u'Cat 3'}]
저는 나머지 프레임워크에 대한 역관계에 대한 문서를 읽었지만 그것은 역이 아닌 필드와 동일한 결과인 것 같습니다.제가 뭔가 명백한 것을 놓쳤나요?
DRF 버전 3.6.3에서는 이 기능이 작동했습니다.
class ItemSerializer(serializers.ModelSerializer):
category_name = serializers.CharField(source='category.name')
class Meta:
model = Item
fields = ('id', 'name', 'category_name')
자세한 내용은 여기에서 확인할 수 있습니다. Serializer Fields 핵심 인수
설정하지 .many=True.
이 " 또출력이지정하야때참기오시십고하문에해한름"이기 때문에 하십시오.category_name는 하만실제 분는야지는입니다.category당신은 그것을 사용할 필요가 있습니다.source필드의 .serializer 파일입니다.
다음은 필요한 출력을 제공합니다.
class ItemSerializer(serializers.ModelSerializer):
category_name = serializers.RelatedField(source='category', read_only=True)
class Meta:
model = Item
fields = ('id', 'name', 'category_name')
또 다른 방법은 다음과 같습니다.
- 에 .
Item과 범주이반는모형을 - 그것을 a로 드러내다.
ReadOnlyField.
당신의 모델은 이렇게 보일 것입니다.
class Item(models.Model):
name = models.CharField(max_length=100)
category = models.ForeignKey(Category, related_name='items')
def __unicode__(self):
return self.name
@property
def category_name(self):
return self.category.name
당신의 시리얼라이저는 이렇게 보일 것입니다.으로 serializer 값을 .category_name필드 이름을 동일한 이름으로 지정하여 속성을 모형화합니다.
class ItemSerializer(serializers.ModelSerializer):
category_name = serializers.ReadOnlyField()
class Meta:
model = Item
이것은 나에게 잘 작동했습니다.
class ItemSerializer(serializers.ModelSerializer):
category_name = serializers.ReadOnlyField(source='category.name')
class Meta:
model = Item
fields = "__all__"
솔루션 간단한해책결책▁simple해결한source='category.name'category이고 외키입다니입니다..name속성입니다.
from rest_framework.serializers import ModelSerializer, ReadOnlyField
from my_app.models import Item
class ItemSerializer(ModelSerializer):
category_name = ReadOnlyField(source='category.name')
class Meta:
model = Item
fields = "__all__"
2018년 8월 8일 및 DRF 버전 3.8.2에서 작업:
class ItemSerializer(serializers.ModelSerializer):
category_name = serializers.ReadOnlyField(source='category.name')
class Meta:
model = Item
read_only_fields = ('id', 'category_name')
fields = ('id', 'category_name', 'name',)
read_only_fields어떤 필드를 read_only로 해야 하는지 정확히 선언할 수 있습니다.그러면 우리는 신고해야 합니다.foreign 타의 fields(맨트라처럼 명시적으로 말하는 것이 더 좋습니다: 파이썬의 젠).
이 솔루션은 소스 모델을 정의할 필요가 없기 때문에 더 좋습니다.그러나 serializer 필드의 이름은 외부 키 필드 이름과 같아야 합니다.
class ItemSerializer(serializers.ModelSerializer):
category = serializers.SlugRelatedField(read_only=True, slug_field='title')
class Meta:
model = Item
fields = ('id', 'name', 'category')
ForeignKey(ID를 표시하는 ForeignKey) 필드를 바꾸려는 사용자의 경우에도__all__편리한 구문을 제공하며 필드 이름을 원하는 대로 덮어씁니다.예:
class MyModelSerializer(serializers.ModelSerializer):
# override the category field that would otherwise show an integer value
# for the ID with the field of that model you choose. "name" here.
category = serializers.ReadOnlyField(source='category.name')
class Meta:
model = MyModel
fields = '__all__'
한 b입니다. 은 여전히 IMO를 할 수 있습니다.__all__나중에 추가된 필드를 캡처하는 구문입니다.재정의되는 모든 작업은 수동으로 수행되며, 되돌려야 할 경우 다른 구문을 변경하지 않고 일부 작업을 수동으로 수행할 수 있습니다.
언급URL : https://stackoverflow.com/questions/17280007/retrieving-a-foreign-key-value-with-django-rest-framework-serializers
'codememo' 카테고리의 다른 글
| .py 파일과 .pyc 파일의 차이점은 무엇입니까? (0) | 2023.07.22 |
|---|---|
| 밀도로 채색된 산점도를 만들려면 어떻게 해야 합니까? (0) | 2023.07.22 |
| 커서에서 행 수를 찾는 방법 (0) | 2023.07.22 |
| 반복을 사용하지 않고 배열 반전 (0) | 2023.07.22 |
| 장고에서 언제 새로운 앱(시작 앱 포함)을 만들 수 있습니까? (0) | 2023.07.22 |