我希望能夠使用基礎模型創建一個物件,但該物件實際上被創建為一個代理類,這取決于該物件的欄位。
因此,舉例來說,對于以下模型:
class Animal(models.Model)。
species = models.CharField()
class Cat(Animal)。
class Meta:
proxy = True Meta: Meta: True
class Dog(Animal)。
class Meta:
我如何設定它,以便
我如何設定它,以便
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) 物件是由一個人的名字命名的,他的名字叫 "狗"。
a) 物件先被創建為Animal,然后再轉換為代理類
b) 物件被直接創建為代理類
。(不幸的是,解決方案型別A可能與我的用例最相關)
(解決方案型別A可能與我的用例最相關)。
uj5u.com熱心網友回復:
你應該為每個代理創建一個自定義管理器。
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:
代理 = True Meta: 代理
class Dog(Animal)。
objects = DogManager()
class Meta:
proxy = True True
uj5u.com熱心網友回復:
為Animal定義一個自定義管理器,它將基于物種過濾查詢集。在這里,我們將使用類的名稱作為物種名稱的基礎。
class AnimalManager(models.Manager)。
def get_queryset(self)。
如果self.model是Animal。
回傳super().get_queryset()。
return super().get_queryset().filter(species=self。 model.__name__.casefold()
class Animal(models.Model) 。
objects = AnimalManager()
species = models.CharField(max_length=100)
class Cat(Animal)。
class Meta:
class Dog(Animal)。
class Meta:
輸出
>>> from my_app.models import *
>>>。
>>> # Create the animals
>>> Animal.objects.create(species="cat"/span>)
<動物。動物物件(1)>
>>> Animal.objects.create(species="dog")
<動物。動物物件(2)>
>>> Animal.objects.create(species="cat")
<動物。動物物件(3)>
>>> Animal.objects.create(species="cat")
<動物。動物物件(4)>
>>> Animal.objects.create(species="dog")
<動物。動物物件(5)>
>>>。
>>> #查詢動物。
>>> Animal.objects.all()
<查詢集[<動物。動物物件 (1)>, <動物。動物 物體 (2)>, <動物。動物 物體 (3)>, <動物。動物 物體 (4)>, <動物。Animal object (5)>] >
>>> Cat.objects.all()
<查詢集 [<Cat: Cat object (1)> , <Cat: Cat object (3)>, <Cat: Cat object (4)> ] >
>>> Dog.objects.all()
<查詢集[<狗。Dog object (2)> , <Dog: Dog object (5)>】>。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/323535.html
標籤:
上一篇:如何在DjangoListView中列出模型欄位的子欄位?
下一篇:Angular中的反應式表單管理
