假设我有一个抽象基类和一些子类
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
但这似乎非常混乱,而且不是正确的做事方式。