Django 视图中显示外键关系的问题
我有一个Django 视图中显示外键关系的问题,django,django-rest-framework,django-serializer,django-rest-viewsets,Django,Django Rest Framework,Django Serializer,Django Rest Viewsets,我有一个Land模型,有三个关系,其中一个是Letter,模型是: class Letter(models.Model): land = models.ForeignKey('Land', on_delete=models.DO_NOTHING) image = models.ImageField(null=True, upload_to=letter_image_file_path) text = models.TextField(null=True, blank=Tr
Land
模型,有三个关系,其中一个是Letter
,模型是:
class Letter(models.Model):
land = models.ForeignKey('Land', on_delete=models.DO_NOTHING)
image = models.ImageField(null=True, upload_to=letter_image_file_path)
text = models.TextField(null=True, blank=True)
def __str__(self):
return str(self.id)
它的序列化程序是
class LettersSerializer(serializers.ModelSerializer):
class Meta:
model = Letter
fields = ('id', 'text', 'image', 'land',)
read_only_fields = ('id',)
而Land
序列化程序是:
class LandSerializer(serializers.ModelSerializer):
utm_points = UTMPointsSerializer(many=True, read_only=True)
letters = LettersSerializer(many=True, read_only=True)
他们的意见是:
class BasicViewSet(viewsets.ModelViewSet):
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
class LandViewSet(BasicViewSet):
serializer_class = LandSerializer
queryset = Land.objects.all()
class UTMPointViewSet(BasicViewSet):
serializer_class = UTMPointsSerializer
queryset = UTMPoint.objects.all()
class LettersViewSet(BasicViewSet):
serializer_class = LettersSerializer
queryset = Letter.objects.all()
但是当我发送GET
请求时,它不会显示字母
字段:以下是响应:
{
"id": 1,
"utm_points": []
}
虽然utm_点
和字母
完全相同,但结果不同。
Land
模型具有user
关系,我将其删除为简单。
经过一些尝试和错误之后,我不知道为什么结果没有
字母
字段。您需要向字母序列化程序解释使用什么序列化程序来序列化和。您不能使用LandSerializer
,因为这将创建循环依赖项,但更重要的是:响应中可能存在无限递归,因为字母
具有land
,而land随后序列化其相关的
字母,等等
因此,我们为Land
创建了一个简单的序列化程序:
class SimpleLandSerializer(serializers.ModelSerializer):
utm_points = UTMPointsSerializer(many=True, read_only=True)
class Meta:
model = Land
fields = ['utm_points']
class LettersSerializer(serializers.ModelSerializer):
land = SimpleLandSerializer()
class Meta:
model = Letter
fields = ('id', 'text', 'image', 'land',)
read_only_fields = ('id',)
编辑:您还可以使用主键进行序列化,在这种情况下,您可以使用:
您需要向LetterSerializer
解释使用什么序列化程序来序列化Land
。您不能使用LandSerializer
,因为这将创建循环依赖项,但更重要的是:响应中可能存在无限递归,因为字母
具有land
,而land随后序列化其相关的
字母,等等
因此,我们为Land
创建了一个简单的序列化程序:
class SimpleLandSerializer(serializers.ModelSerializer):
utm_points = UTMPointsSerializer(many=True, read_only=True)
class Meta:
model = Land
fields = ['utm_points']
class LettersSerializer(serializers.ModelSerializer):
land = SimpleLandSerializer()
class Meta:
model = Letter
fields = ('id', 'text', 'image', 'land',)
read_only_fields = ('id',)
编辑:您还可以使用主键进行序列化,在这种情况下,您可以使用:
实际上,我需要在land response中显示字母,但您建议LettersSerializer
应显示land serializer,另一方面,字母和UTMPoints完全相同。那么为什么字母不会被显示呢?@moslem:因为这会导致一个序列化循环,如果你序列化一个字母
,你序列化它的土地
,那么土地
将序列化新的字母
,它将再次序列化土地,所以JSON看起来像{land:{letters':[{'land':…}]}
并因此产生无限长的响应。没有字母序列化器
只序列化Land的id
,
您可以在序列化器的定义中看到它,并且utm
具有完全相同的实现,但没有任何问题您的字母序列化器
具有as字段D=('id'、'text'、'image'、'land')
…是的,但它只是序列化了id这是输出{“id”:2,“text”:“test”,“image”:null,“land”:1},
实际上我需要在land response中显示字母,但你建议字母序列化器
应该显示land serializer,另一方面字母和utmpoint完全相同。那么为什么不显示字母呢?@moslem:因为这会导致一个序列化循环,如果你序列化字母
,你就可以进行序列化将其land
,然后land
将序列化新的字母
s,这将再次序列化land,因此JSON看起来像{'land':{'letters':[{'land':…}]}
并因此产生无限长的响应。没有字母序列化器
只序列化Land的id
,
您可以在序列化器的定义中看到它,并且utm
具有完全相同的实现,但没有任何问题您的字母序列化器
具有as字段D=('id'、'text'、'image'、'land')
…是的,但它只是序列化了id这是输出{“id”:2,“text”:“test”,“image”:null,“land”:1},