我在Django中有一个包含多个表的数据库。
1表是人,1表是部门,1表是志愿者,其中有多对多的关系。
以下是 Department 模型的相关部分:
class Department(models.Model):
name = models.CharField('Navn',max_length=200)
def __str__(self):
return self.name
以下是 Person 模型的相关部分:
class Person(models.Model):
name = models.CharField('Navn',max_length=200)
def __str__(self):
return self.name
这是志愿者:
class Volunteer(models.Model):
person = models.ForeignKey(Person)
department = models.ForeignKey(Department)
added = models.DateTimeField('Start', default=timezone.now)
removed = models.DateTimeField('Slut', blank=True, null=True, default=None)
approved = models.DateTimeField('Godkendt af afdelingsleder',default=timezone.now, null=True, blank=True)
class Meta:
verbose_name = "Frivillig"
verbose_name_plural = "Frivillige"
def __str__(self):
return self.person.__str__()
def has_certificate(self):
return self.person.has_certificate
我希望能够选择所有活跃的志愿者和非志愿者。
这是我在管理区域中用于过滤器的代码的一部分:
if self.value() == 'any':
return queryset.exclude(volunteer__isnull=True).exclude(volunteer__removed__isnull=False)
elif self.value() == 'none':
return queryset.filter(volunteer__isnull=True).filter(volunteer__removed__isnull=False)
删除的字段是一个日期时间字段,用于志愿者何时不再是该部门的志愿者。
我的问题是,如果一个人是一个以上部门的志愿者,那么它将无法返回正确的结果。
对于任何人,如果至少有一名志愿者被删除,则该人应该返回。
如果没有志愿者被删除,则应该返回一个人。
我搜索了文档以及Google和Stack Overflow周围的所有内容,我尝试过把它放在for循环中,但我无法使用它。
答案 0 :(得分:0)
我希望能够选择所有活跃的志愿者和所有活跃的志愿者 不是志愿者。
尝试从Person
模型接近此模型,每个模型都会自动由django创建reverse relationship;这意味着什么:
p.volunteer_set.all() # returns all volunteer object for this person
所以,要找出哪些人是志愿者:
p.volunteer_set.filter(removed__isnull=False).exists()
如果这是真的,那么它意味着至少有一个删除的记录是空的是假的。
答案 1 :(得分:0)
我最终以下列方式解决了这个问题:
if self.value() == 'any':
return queryset.filter(volunteer__isnull=False).filter(volunteer__removed__isnull=True).distinct()
elif self.value() == 'none':
return queryset.filter(volunteer__isnull=True) | queryset.exclude(volunteer__removed__isnull=True).distinct()