[英]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.