【发布时间】:2014-06-11 16:48:47
【问题描述】:
我有一些模型,其中对象与日期相关,但它们之间的关系也与日期相关。所以,为了说明,我可能有
class ValidCommonManager(models.Manager):
ValidCommonManager(self, date):
self.date = date
def get_query_set(self):
return super(ValidCommonManager, self).get_query_set().filter(
models.Q(start__isnull=True)|
models.Q(start__lte=self.date)
).filter(
models.Q(end__isnull=True)|
models.Q(end__gte=self.date)
)
class CommonModel(models.Model):
start = models.DateTimeField(null=True)
end = models.DateTimeField(null=True)
valid_objects = ValidCommonManager(now())
objects = models.Manager()
class Group(CommonModel):
name = models.CharField(max_length=25)
description = models.TextField(blank=True)
group_members = models.ManyToManyField(
'Person', through='GroupMember')
class GroupMember(CommonModel):
group = models.ForeignKey(Group)
member = models.ForeignKey(Person)
class Person(CommonModel):
name = models.CharField(max_length=100)
现在组可能存在于日期 A 到日期 Z,但成员资格在日期 B 和日期 C 可能不同,这反映在 GroupMember 中的开始和结束字段中。现在可以很容易地找到在我当前处理时处于活动状态的组
groups = Group.valid_objects.all()
但我想不出一个简单的方法来让小组成员在给定日期不到
members_of_my_group = group.group_members.filter(
models.Q(start__isnull=True)|
models.Q(start__lte=date)
).filter(
models.Q(end__isnull=True)|
models.Q(end__gte=date)
).filter(
models.Q(group_member__start__isnull=True)|
models.Q(group_member__start__lte=date)
).filter(
models.Q(group_member__end__isnull=True)|
models.Q(group_member__end__gte=date)
)
这很快变得笨拙并违反了 DRY 的基本原则。我会在ValidCommonManager 上设置use_for_related_fields,但是如果你在过滤的经理身上这样做,Django docs 承诺会发生令人讨厌的事情。
【问题讨论】:
标签: django django-orm