过滤其关系模型

时间:2017-01-31 14:11:20

标签: django django-orm

假设我有这个模型

class Employee(models.Model):
    name = models.CharField(max_lenght=25)

class Attendance(models.Model):
    employee = ForeignKey(Employee, on_delete=models.CASCADE)

    is_present = models.BooleanField()

这是我的实施:

Employee.objects.bulk_create([
    Employee(name='Greg'),
    Employee(name='John'),
    Employee(name='Lesley'),
])

emp1 = Employee.objects.get(name='Greg')
emp1.attendance_set.create(is_present=True)
emp1.attendance_set.create(is_present=True)
emp1.attendance_set.create(is_present=True)

emp2 = Employee.objects.get(name='John')
emp2.attendance_set.create(is_present=True)
emp2.attendance_set.create(is_present=True)
emp2.attendance_set.create(is_present=True)

emp3 = Employee.objects.get(name='Lesley')
emp3.attendance_set.create(is_present=True)
emp3.attendance_set.create(is_present=False)

现在我如何从没有Attendance.is_present=False的员工级别过滤员工,这将产生Greg和John的独特记录?

我到目前为止尝试了这个,但它包括Lesley

Employee.objects.filter(attendance__is_present=True).distinct()

4 个答案:

答案 0 :(得分:2)

我能够使用exclude()

过滤正确的查询集

首先,如果您有一些需要包含在查询集中的查询所需条件,则可以执行filter()函数,然后执行exclude()函数,该函数将删除所有记录为{{{ 1}}

attendance__is_present=False

如果除了Employee.objects.filter( # some criteria.. ).exclude( attendance__is_present=False ).distinct() 之外没有任何标准,您可以直接按 @Piyush S. Wanare 回答。

答案 1 :(得分:1)

使用:

Attendance.objects.filter(is_present=True)

答案 2 :(得分:1)

您可以直接执行此操作:

Employee.objects.exclude(
    attendance__is_present=False
).distinct()

答案 3 :(得分:0)

这样的事情应该有效 -

employees = [attendance.employee for attendance in Attendance.objects.filter(is_present = False)]