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},