簡體   English   中英

Django Serializer 中引用關系的關系

[英]Referencing relation's relations in Django Serializer

假設我有一些模型:

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中的所有字段以及B中對A的引用(但不是C中對B的引用),因此 JSON 88100051213384 803334是這樣的:

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

我怎么會go這個呢? 我已經嘗試在我的序列化程序中為C做這樣的事情:

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

但這不起作用,因為 DRF 似乎不支持源的虛線路徑。 我還嘗試提供一種方法,該方法返回正確的 model(model 在方法內部有效)作為源,但將 JSON 中的引用輸出為:

"a": {
    "data": null
}

在我A model 上,我還引用了另一個 model, D ,它沒有在A中明確說明,而是在D中定義為 OneToMany 關系(許多D模型到一個A模型),在 ForeignKey 上聲明了 resource_name在D中,並嘗試在C中引用它以將該關系包含在 JSON 中也不起作用。 我收到此錯誤(嘗試通過執行D = DSerializer(source='B.D')來引用它):

'RelatedManager' object has no attribute 'B'

任何幫助將不勝感激。

我想到了。 只要回答我自己的問題,以防有人登陸該頁面並且需要幫助。

您需要使用Django Rest Framework JSON API中的SerializerMethodResourceRelatedField 我曾經嘗試過常規ResourceRelatedField不能正常工作,但通過查看源代碼可以發現ResourceRelatedField不支持點划線。 而是使用SerializerMethodResourceRelatedField ,將源指向返回所需關系的方法。

# 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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM