【问题标题】:Django Rest framework getting all foreign key data in parent objectDjango Rest框架获取父对象中的所有外键数据
【发布时间】:2021-03-03 08:19:25
【问题描述】:

我有一个像下面这样的家庭模型

class Family(models.Model):
    name = models.CharField(max_length=255)
    address = models.CharField(max_length=500, blank=False)
    monthly_contribution = models.FloatField(default=0)
    enabled = models.BooleanField(default=True)

    def __str__(self):
        return self.name + f' ({self.address})'

我有一个像下面这样的教区居民模型

class Parishioner(models.Model):

    def _age(self):
        return date.today().year - self.dob.year

    """Parishioner model"""
    id = models.CharField(primary_key=True, max_length=1000, default=get_next_parishoner_id)
    first_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    dob = models.DateField()
    age = property(_age)
    GENDER_CHOICES = [("Male", "Male"), ("Female", "Female"), ("Other", "Other")]
    gender = models.CharField(max_length=10, choices=GENDER_CHOICES)
    address = models.CharField(max_length=1000)
    fathers_name = models.CharField(max_length=500)
    mothers_name = models.CharField(max_length=500)
    baptism_certificate = models.ImageField(null=True, upload_to=upload_image)
    marriage_certificate = models.ImageField(null=True, upload_to=upload_image)
    family = models.ForeignKey(Family, null=True, on_delete=models.PROTECT)
    role = models.CharField(null=True, max_length=255)

    def __str__(self):
        return self.first_name + " " + self.last_name

这是我的家庭视图

class FamilyViewSet(viewsets.ModelViewSet):
    queryset = Family.objects.all()
    serializer_class = FamilySerializer
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)

这是我的教区居民观点

class ParishionerViewSet(viewsets.ModelViewSet):
    queryset = Parishioner.objects.all()
    serializer_class = serializers.ParishionerSerializer
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)

这是我的家庭序列化程序

class FamilySerializer(serializers.ModelSerializer):
    members = ParishionerSerializer(read_only=True, many=True)

    class Meta:
        model = Family
        fields = ('id', 'name', 'address', 'monthly_contribution','members', 'enabled')
        read_only_fields = ('id','members',)

这是我的 Parishioner 序列化程序

class ParishionerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Parishioner
        fields = ('id','first_name', 'last_name', 'dob', 'age', 'gender', 'address', 'fathers_name', 'mothers_name', 'baptism_certificate', 'marriage_certificate', 'family', 'role')
        read_only_fields = ('id',)

所以关系是一对多的。 教区居民可以存在于一个家庭中。 一个家庭有很多成员(教区居民)。

当我打电话给我的 /api/family/ 时,我得到了以下响应

[
    {
        "id": 13,
        "name": "Mendis Family",
        "address": "No 48, Katukurunda",
        "monthly_contribution": 50.0,
        "enabled": false
    },
    {
        "id": 14,
        "name": "Perera Family",
        "address": "No 40",
        "monthly_contribution": 20.0,
        "enabled": true
    }
]

是否可以在成员属性(数组)的响应中获取所有成员? 像下面这样?

[
        {
            "id": 13,
            "name": "Mendis Family",
            "address": "No 48, Katukurunda",
            "monthly_contribution": 50.0,
            "members":[{"id":"1", "first_name":"John",...etc},
                        {"id":"2", "first_name":"Jane",...etc}],
            "enabled": false
        },
        {
            "id": 14,
            "name": "Perera Family",
            "address": "No 40",
            "monthly_contribution": 20.0,
             "members":[{"id":"3", "first_name":"Jackie",...etc},
                        {"id":"4", "first_name":"Jockie",...etc}]
            "enabled": true
        }
    ]

【问题讨论】:

    标签: python-3.x django django-models django-rest-framework django-views


    【解决方案1】:

    将此添加到您的 FamilySerializer 中。

    members = serializers.SerializerMethodField()
    
    def get_members(self, obj):
        queryset = Parishioner.objects.filter(family=obj.id)
        serializer = ParishionerSerializer(queryset, many=True)
        return serializer.data
    

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-23
      相关资源
      最近更新 更多