Django Rest框架M2M通过模型字段未解析

2024-09-29 23:32:25 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的模型

# Models
class Category(models.Model):
    parent = models.ForeignKey('Category', null=True, blank=True, related_name="children")
    name = models.CharField(max_length=64)
    alternate_naming = models.ManyToManyField('businesses.Office', through='CategoryOfficeNaming', blank=True)


class CategoryOfficeNaming(models.Model):
    category = models.ForeignKey('Category')
    office = models.ForeignKey('businesses.Office')
    name = models.CharField(max_length=64)

这是我的序列化程序

# Serializers
class CategoryOfficeNamingSerializer(serializers.ModelSerializer):
    class Meta:
        model = CategoryOfficeNaming
        fields = (
            'office',
            'name',
        )


class CategorySerializer(serializers.ModelSerializer):
    # We need special recursive serialization here for Category (parent) -> Category (child) relationship
    children = serializers.ListSerializer(read_only=True, child=RecursiveField())
    alternate_naming = CategoryOfficeNamingSerializer(many=True)

    class Meta:
        model = Category
        fields = (
            'children',
            'name',
            'alternate_naming',
        )

尝试序列化类别时出错:

AttributeError at /api/categories/
'Office' object has no attribute 'category'

似乎序列化程序(备用命名)指向一个Office实例,而不是使用through模型(CategoryOfficeNaming)——为什么?我可能在做傻事!你知道吗


Tags: name模型truemodel序列化modelsclassoffice
1条回答
网友
1楼 · 发布于 2024-09-29 23:32:25

A,哈!你知道吗

原来我是误会了什么时候用通透表一点。我没有使用直通表,而是使用了这种结构,得到了一种适用于这种情况的方法:

型号:

# Models
class Category(models.Model):
    parent = models.ForeignKey('Category', null=True, blank=True, related_name="children")
    name = models.CharField(max_length=64)


class CategoryOfficeNaming(models.Model):
    category = models.ForeignKey('Category', related_name="alternate_namings")
    office = models.ForeignKey('businesses.Office')
    name = models.CharField(max_length=64)

序列化程序:

# Serializers
class CategoryOfficeNamingSerializer(serializers.ModelSerializer):

    class Meta:
        model = CategoryOfficeNaming
        fields = (
            'office',
            'name',
        )


class CategorySerializer(serializers.ModelSerializer):
    # We need special recursive serialization here for Category (parent) -> Category (child) relationship
    children = serializers.ListSerializer(read_only=True, child=RecursiveField())
    alternate_namings = CategoryOfficeNamingSerializer(many=True)

    class Meta:
        model = Category
        fields = (
            'children',
            'name',
            'alternate_namings',
        )

相关问题 更多 >

    热门问题