首页 > 解决方案 > 对象创建根据基本模型字段分配代理类

问题描述

我希望能够使用基本模型创建对象,但根据对象的字段将该对象实际创建为代理类。

例如,对于以下模型:

class Animal(models.Model):
    species = models.CharField()

class Cat(Animal):
    class Meta:
        proxy = True

class Dog(Animal):
    class Meta:
        proxy = True

我该如何设置它以便

cat = Animal.objects.create(species="cat")
dog = Animal.objects.create(species="dog")

Animal.objects.all() # Returns queryset of [cat, dog]
Cat.objects.all() # Returns queryset of [cat]
Dog.objects.all() # Returns queryset of [dog]

编辑:我会对这两种类型的解决方案感兴趣:

a)首先创建对象,Animal然后转换为代理类

b) 对象直接创建为代理类

(不幸的是,解决方案类型 A 可能与我的用例最相关)

标签: djangodjango-modelsdjango-querysetdjango-managers

解决方案


您应该为每个代理创建一个自定义管理器。

class Animal(models.Model):
    species = models.CharField()

class CatManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(species='cat')

class DogManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(species='dog')

class Cat(Animal):
    objects = CatManager()
    class Meta:
        proxy = True

class Dog(Animal):
    objects = DogManager()
    class Meta:
        proxy = True


推荐阅读