簡體   English   中英

Django Rest Serializer通過外鍵獲取相關數據

[英]Django Rest Serializer get data related through Foreign Keys

我有以下模型骨架:

class A(models.Model):
    post_id = models.ForeignKey('D')
    user_id = models.ForeignKey('B')

class B(AbstractBaseUser):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=20, unique=True)    
    first_name = models.CharField(max_length=40)
    last_name = models.CharField(max_length=40)
    # `resource_id`
    profile_photo = models.ForeignKey('C', null=True)

class C(models.Model):
    user_id = models.ForeignKey('B')
    name = models.CharField(max_length=60)

我想為A編寫一個序列化程序,該序列化程序應從模型C返回與B相關的name

這里的關系就像A-> B-> C現在使用A的序列化器,我希望從C中獲取數據

我想通過A訪問C,即從B獲取profile_photo並從C獲取profile_photo的名稱

我在Django Rest關系中瀏覽了RelatedFields,但無法實現我想要的。

是他們能實現的任何方式。

除了模型骨架中提到的以外,還有很多其他字段,我不想獲取這些字段。

編輯 :我需要的最終結果是來自模型A的name來自A的特定post_id的所有user_id

您可以使用ModelSerializer來做到這一點

注意:我將假設'posts.Post'是模型C

class CsSerializer(serializers.ModelSerializer):

    class Meta:
        model = C
        fields = ('name')


class AsSerializer(serializers.ModelSerializer):

    post_id = CsSerializer()

    class Meta:
        model = A
        # exclude = ('field_you_dont_want_1', 'field_you_dont_want_2')
        # fields = ('field_you_want_1', 'field_you_want_2')

請注意,在CsSerializer您可以從模型C返回所需的任何字段,在這種情況下,我只是返回name

如果只需要一個字符串,則可以使用StringRelatedField

class AsSerializer(serializers.ModelSerializer):
    post_id = serializers.StringRelatedField(many=True)

    class Meta:
        model = A

StringRelatedField將返回C模型以__unicode__方法返回的內容(如果是python 3.x, __str__方法)。

編輯

現在,根據您的評論,我知道'posts.Post'不是C模型。 因此,您可以使用SerializerMethodField

class AsSerializer(serializers.ModelSerializer):
    c_name = serializers.SerializerMethodField()

    def get_c_name(self, obj):
        return obj.user_id.c_set.values('name')  # this will return a list of dicts with B's related C objects.

    class Meta:
        model = A

編輯

您始終可以在模型中定義類方法:

class B(AbstractBaseUser):
    email = models.EmailField(unique=True)
    username = models.CharField(max_length=20, unique=True)    
    first_name = models.CharField(max_length=40)
    last_name = models.CharField(max_length=40)
    # `resource_id`
    profile_photo = models.ForeignKey('C', null=True)

    def get_profile_photo(self):
        return self.profile_photo.name  # This will return 'C' related object's name

因此,當您擁有A的對象時:

a_object.user_id.get_profile_photo()

或者,如果您有B的對象:

b_object.get_profile_photo()

編輯

您可以為C類定義一個新的序列化器:

class CsSerializer(serializers.Serializer):

    class Meta:
        model = C

然后在您的AsSerializer

class AsSerializer(serializers.ModelSerializer):
    c_name = serializers.SerializerMethodField()

    def get_c_name(self, obj):
        qs = obj.user_id.c_set.all()
        qs_serialized = CsSerializer(qs, many=True)
        return qs_serialized.data

    class Meta:
        model = A

暫無
暫無

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

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