新しい関連フィールド タイプを作成したいと思います。簡単な例を次に示します。
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
に相当するクエリセットを返す必要があり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)
は期待どおりに機能するはずです。
これはaで実装できることはわかっManyToManyField
ていますが、アイテムオブジェクトをc.itemに手動で追加/削除したくありません。c.item は常に単一の id 値を使用するため、結合テーブルは必要ありません。コレクションの主キーではないだけです。またc.item
、異なる ID 値を持つアイテム オブジェクトを含む/含まない場合があります。
これには、サブクラス化django.db.models.fields.related.ForeignRelatedObjectsDescriptor
および/またはdjango.db.models.fields.related.ForeignObject
(または、場合によっては ManyToMany に相当するもの) が必要になる可能性が高いことを認識しています。