我想構建一個新的相關字段類型。這裏有一個簡單的例子:構建一個返回多個值的Django「ForeignKey」
class CustomQuerySet(QuerySet):
def current(self):
return self.filter(invalid_date__isnull=True)
class CustomManager(Manager):
def get_query_set(self):
return CustomQuerySet(self.model, using=self._db)
def current(self):
return self.get_query_set().current()
class Item(models.Model):
objects = CustomManager()
row_id = models.IntegerField(primary_key=True)
id = models.IntegerField()
name = models.CharField(max_length=100)
change_date = models.DateTimeField(auto_now_add=True)
invalid_date = models.DateTimeField(null=True, blank=True)
class Collection(models.Model):
item = MultipleRelatedField(Item, related_field='id', related_name='collections')
name = models.CharField(max_length=100)
鑑於c = Collection()
:
c.item
應該返回一個QuerySet相當於Item.objects.filter(id=c.item_id)
。- 該查詢集確實需要是CustomQuerySet的一個實例
Item.objects.filter(collections__name='SomeName')
應該按預期工作。- 操作
Collection.objects.filter(item__name='OtherName', item__invalid_date__isnull=True)
應該按預期工作。
我知道這可以用ManyToManyField
實現,但我不想手動添加/刪除項目對象到c.item。我不需要連接表,因爲c.item總是使用單個id值,但它不是Collection上的主鍵。並且c.item
可能/不包含具有不同id值的項目對象。
我知道這可能需要子類django.db.models.fields.related.ForeignRelatedObjectsDescriptor
和/或django.db.models.fields.related.ForeignObject
(或可能ManyToMany等效)。
每個項目是否屬於一個集合?如果是這樣,您可能只需在您的Item對象上指向'Collection'的'ForeignKey'。您可以使用'RelatedManager'來自定義反向關係爲您提供的查詢集。 –
好問題。名字是人爲設計的,可能有多個類像'Collection',並且修改'Item'爲每個類添加'ForeignKey'是不可接受的。 'MultiRelatedField'作爲一個返回多個值的'ForeignKey'函數。所以不止一個'Collection'可以引用相同的'id'值。 –