如果该结果Django的字段为null,则仅返回结果

时间:2016-05-07 10:07:58

标签: mysql django database

我在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循环中,但我无法使用它。

2 个答案:

答案 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()