首页 > 解决方案 > Django Rest Framework 从相关表中获取数据

问题描述

我有一个数据库表,这与这些卡所属的cards另一个表有关系。sets这些Cards表有一个外键,set_id它将两个表链接在一起。当我返回卡片数据时,我正在努力返回卡片所属集合的相关数据。

模型.py

class Set(models.Model):
    id   = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    code = models.CharField(max_length=64)
    
    ...

    objects = models.Manager()

    def __str__(self):
        return self.name

class Card(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    
    ...

    set = models.ForeignKey(Set, on_delete=models.CASCADE, related_name='cards', related_query_name='cards')

    objects = models.Manager()

    def __str__(self):
        return self.name

    @property
    def manaCostList(self):
        a0 = self.manaCost.replace('//', '{//}')
        a1 = a0.split('{')
        a2 = [s.strip('} ') for s in a1]
        a3 = [s.replace('//', 'slash') for s in a2]
        a4 = [s.replace('/', '') for s in a3]
        a5 = list(filter(None, a4))
        return a5

序列化程序.py

class SetSerializers(serializers.ModelSerializer):
    class Meta:
        model = Set
        fields = '__all__'

class CardSerializers(serializers.ModelSerializer):
    cards = SetSerializers(many=True, read_only=True)

    class Meta:
        model = Card
        fields = '__all__'
        extra_fields = ['cards', 'manaCostList']

    def get_field_names(self, declared_fields, info):
        expanded_fields = super(CardSerializers, self).get_field_names(declared_fields, info)

        if getattr(self.Meta, 'extra_fields', None):
            return expanded_fields + self.Meta.extra_fields
        else:
            return expanded_fields

在我的 JavaScript 中,当我执行 a 时console.log(b),表中没有数据Sets

标签: pythondjango

解决方案


我设法让它工作。我已经替换cards = SetSerializers(many=True, read_only=True)setCode = serializers.CharField(read_only=True, source="set.code").

这会添加一个setCode从父表调用到响应的字段。

class CardSerializers(serializers.ModelSerializer):
    setCode = serializers.CharField(read_only=True, source="set.code")

    class Meta:
        model = Card
        fields = '__all__'
        extra_fields = ['setCode', 'manaCostList']

    def get_field_names(self, declared_fields, info):
        expanded_fields = super(CardSerializers, self).get_field_names(declared_fields, info)

        if getattr(self.Meta, 'extra_fields', None):
            return expanded_fields + self.Meta.extra_fields
        else:
            return expanded_fields


推荐阅读