django-rest-framework serializer로 외래 키 값 검색
django rest 프레임 워크를 사용하여 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'}]
나머지 프레임 워크에 대한 역관계에 대한 문서를 읽었 지만 역전이 아닌 필드와 동일한 결과로 보입니다. 나는 명백한 것을 놓치고 있습니까?
설정하지 않고 관련 필드를 사용하십시오 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')
현재 DRF (3.6.3) 버전에서 이것은 나를 위해 일했습니다.
class ItemSerializer(serializers.ModelSerializer):
category_name = serializers.CharField(source='category.name')
class Meta:
model = Item
fields = ('id', 'name', 'category_name')
또 다른 방법은 다음과 같습니다.
Item
모델에서 카테고리 이름을 반환 하는 속성을 만들고- 그것을
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__"
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',)
Meta를 사용하면 read_only_fields
어떤 필드가 읽기 전용인지 정확하게 선언 할 수 있습니다. 그런 다음 foreign
메타에 필드 를 선언해야합니다 fields
(만트라가 진행되는대로 명시 적으로 더 잘 설명 : zen of python ).
외래 키와 속성 이 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__
ReferenceURL : https://stackoverflow.com/questions/17280007/retrieving-a-foreign-key-value-with-django-rest-framework-serializers
'programing tip' 카테고리의 다른 글
앱이 기기 또는 시뮬레이터에서 실행 중인지 프로그래밍 방식으로 감지 (0) | 2021.01.10 |
---|---|
런타임에 DLL 경로 가져 오기 (0) | 2021.01.10 |
호스트에서 Docker 컨테이너의 웹 서버에 액세스하는 방법 (0) | 2021.01.10 |
정적 컨텍스트는 항상 C #에서 단일입니까? (0) | 2021.01.10 |
$ .each ()가 모든 항목을 반복하지 않는 이유는 무엇입니까? (0) | 2021.01.09 |