Django序列化程序中引用关系的关系

mqkwyuun  于 2022-10-20  发布在  Go
关注(0)|答案(2)|浏览(183)

假设我有一些模型:

class A(models.Model):
    ...

class B(models.Model):
    my_reference_to_a = models.ForeignKey(A)
    b_field_1 = ...
    b_field_2 = ...

class C(models.Model):
    my_reference_to_b = models.ForeignKey(B)
    c_field_1 = ...
    ...

在我的C序列化程序中,我希望包含C中的所有字段、B的所有字段,以及BA(但不包括C内对m1on5o1p)的引用,因此JSON API输出如下所示:

{
    "data": [{
        "type": "C",
        "id": "1",
        "attributes": {
            "b_field_1": "...",
            "b_field_2": "...",
            "c_field_1": "..."
        },
        "relationships": {
            "a": {
                "data": {
                    "type": "A",
                    "id": "1"
                }
            }
        }
    }],
    ...
}

我该怎么办?我已经在C的序列化程序中尝试过这样的操作:

A = ASerializer(source='my_reference_to_b.my_reference_to_a')

但这不起作用,因为DRF似乎不支持源的虚线路径。我还尝试过提供一个方法,该方法返回正确的模型(模型在方法中有效)作为源,但将JSON中的引用输出为:

"a": {
    "data": null
}

在我的A模型上,我还引用了另一个模型D,该模型在A中没有明确声明,而是在m1n 11o1p中将其定义为一对多关系(多个D模式到一个m1n 13o1p模型),其中ForeignKey上的resource_name声明为D,任何一个我得到了这个错误(试图通过执行D = DSerializer(source='B.D')引用它):

'RelatedManager' object has no attribute 'B'

任何帮助都将不胜感激。

xam8gpfp

xam8gpfp1#

我想出来了。只是回答我自己的问题,以防有人登陆本页,他们需要帮助。
您需要使用Django Rest Framework JSON API中的SerializerMethodResourceRelatedField。我尝试了常规的ResourceRelatedField,但没有成功,通过查看源代码,我发现ResourceRelatedField不支持虚线路径。相反,使用SerializerMethodResourceRelatedField,源指向返回所需关系的方法。

qvtsj1bj

qvtsj1bj2#


# Model

from django.db import models

class Album(models.Model):
    album_name = models.CharField(max_length=100)
    artist = models.CharField(max_length=100)

class Track(models.Model):
    album = models.ForeignKey(Album, related_name='tracks',on_delete=models.DO_NOTHING)

    order = models.IntegerField()
    title = models.CharField(max_length=100)
    duration = models.IntegerField()

    class Meta:
        unique_together = ('album', 'order')
        ordering = ['order']

    def __unicode__(self):
        return '%d: %s' % (self.order, self.title)

# View

from rest_framework import generics,viewsets

from api.models import Album
from api.serializers import AlbumSerializer

class TracksView(generics.ListAPIView):
    queryset = Album.objects.all()
    serializer_class = AlbumSerializer

class TracksView(generics.CreateAPIView):
    queryset = Album.objects.all()
    serializer_class = AlbumSerializer

# serializers

from rest_framework import serializers
from api.models import Album

class AlbumSerializer(serializers.ModelSerializer):
    tracks = serializers.StringRelatedField(many=True,)

    class Meta:
        model = Album
        fields = ('album_name', 'artist', 'tracks')

相关问题