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

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

假设我有一些模型:

  1. class A(models.Model):
  2. ...
  3. class B(models.Model):
  4. my_reference_to_a = models.ForeignKey(A)
  5. b_field_1 = ...
  6. b_field_2 = ...
  7. class C(models.Model):
  8. my_reference_to_b = models.ForeignKey(B)
  9. c_field_1 = ...
  10. ...

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

  1. {
  2. "data": [{
  3. "type": "C",
  4. "id": "1",
  5. "attributes": {
  6. "b_field_1": "...",
  7. "b_field_2": "...",
  8. "c_field_1": "..."
  9. },
  10. "relationships": {
  11. "a": {
  12. "data": {
  13. "type": "A",
  14. "id": "1"
  15. }
  16. }
  17. }
  18. }],
  19. ...
  20. }

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

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

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

  1. "a": {
  2. "data": null
  3. }

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

  1. 'RelatedManager' object has no attribute 'B'

任何帮助都将不胜感激。

xam8gpfp

xam8gpfp1#

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

qvtsj1bj

qvtsj1bj2#

  1. # Model
  2. from django.db import models
  3. class Album(models.Model):
  4. album_name = models.CharField(max_length=100)
  5. artist = models.CharField(max_length=100)
  6. class Track(models.Model):
  7. album = models.ForeignKey(Album, related_name='tracks',on_delete=models.DO_NOTHING)
  8. order = models.IntegerField()
  9. title = models.CharField(max_length=100)
  10. duration = models.IntegerField()
  11. class Meta:
  12. unique_together = ('album', 'order')
  13. ordering = ['order']
  14. def __unicode__(self):
  15. return '%d: %s' % (self.order, self.title)
  16. # View
  17. from rest_framework import generics,viewsets
  18. from api.models import Album
  19. from api.serializers import AlbumSerializer
  20. class TracksView(generics.ListAPIView):
  21. queryset = Album.objects.all()
  22. serializer_class = AlbumSerializer
  23. class TracksView(generics.CreateAPIView):
  24. queryset = Album.objects.all()
  25. serializer_class = AlbumSerializer
  26. # serializers
  27. from rest_framework import serializers
  28. from api.models import Album
  29. class AlbumSerializer(serializers.ModelSerializer):
  30. tracks = serializers.StringRelatedField(many=True,)
  31. class Meta:
  32. model = Album
  33. fields = ('album_name', 'artist', 'tracks')
展开查看全部

相关问题