Django通用关系序列化

时间:2016-01-19 22:04:50

标签: python django generics django-rest-framework

假设我有一个抽象基类和一些子类

class Food(models.Model):
    weight = models.SmallIntegerField(
        null=True
    )
    class Meta:
        abstract=True
class Burger(Food):
    ...
class Pizza(Food):
    toppings_amt = models.PositiveIntegerField(
         null=True
    )
    ....
class Plate(models.Model):
    food = GenericRelation('??????')

如何将通用外键添加到抽象基类的子类中?如果我将它添加到Food类中,如下所示:

class Food(models.Model):
    content_type = models.ForeignKey(ContentType, null=True)
    object_id = models.PositiveIntegerField(null=True)
    content_object = GenericForeignKey('content_type', 'object_id')
    class Meta:
         abstract=True
class Plate(models.Model):
    food = GenericRelation('Food')

然后它给了我一个错误:

`AttributeError: 'str' object has no attribute '_default_manager'

我认为这是因为我使用抽象类作为泛型关系,它在数据库中没有实际的表,所以它只是指向一个字符串。

我希望能够序列化' Plate'模型,所以我有

class GenericFoodField(serializers.RelatedField):
    to_representation(self, value):
         if isinstance(value, Pizza):
            return PizzaSerializer(value).data
         elif isinstance(value, Burger):
            return BurgerSerializer(value).data
         raise Exception('Unexpected food type')
class PlateSerializer(serializers.ModelSerializer):
     food = GenericFoodField(
        read_only=True,
        required=False,
        allow_null=True,
        many=True
    )
    class Meta:
        model=Plate
        fields = ('food', ...)

重点是PizzaSerializer与BurgerSerializer有不同的字段。但是,如果Food类不是抽象的,那么序列化器不会解释Food对象的子类。

关于如何形成通用关系的任何想法?我之前有一个模型,它接受了两个GenericForeignKeys,所以我可以做

class GenericFoodField(serializers.RelatedField):
    to_representation(self, value):
         if isinstance(value.food_object, Pizza):
            return PizzaSerializer(value.food_object).data

但这似乎非常混乱,而且不是正确的做事方式。

0 个答案:

没有答案