逆Django查找滤波

逆Django查找滤波,django,django-models,Django,Django Models,所以我有两个模型: class Member(models.Model): course_member = models.ForeignKey(CourseMember, on_delete=models.CASCADE class CourseMember(models.Model): name = models.CharField(max_length=30) 如何获取所有拥有2个或更多成员的CourseMember 还有,如何阻止CourseMember拥有超过1名成员

所以我有两个模型:

class Member(models.Model):
    course_member = models.ForeignKey(CourseMember, on_delete=models.CASCADE

class CourseMember(models.Model):
    name = models.CharField(max_length=30)
如何获取所有拥有2个或更多成员的CourseMember

还有,如何阻止CourseMember拥有超过1名成员

我正在考虑使用聚合和分组方式,但我不确定如何做到这一点

如何获取所有拥有2个或更多成员的CourseMember

您可以使用annotate来实现此目的,如果您将相关的\u名称添加到成员的“课程\u成员”字段,则会更轻松,例如:
course\u member=models.ForeignKey(CourseMember,related\u name='CourseMember\u member',on\u delete=models.CASCADE)
使用此相关的\u名称,您可以执行反向查找以引用父表中的子表,并进行如下注释:
CourseMember.objects.annotate(Count('CourseMember\u member'))。filter(CourseMember\u member\u Count\u gt=1)
这将给出您想要的结果

还有,如何阻止CourseMember拥有超过1名成员


这可以在ORM/数据库级别或程序级别实现,要在ORM级别实现这一点,您可以将课程成员设置为一对一关系,而不是像这样的多对一关系
课程成员=models.OneToOneField(课程成员,on\u delete=models.CASCADE)
如果您试图插入多个具有相同课程成员的行,或者在程序级别,则数据库会引发异常,您可以通过检查是否存在具有相同课程成员的行(如果存在)来实现该异常,并对其进行处理

如果零是正常的,则与
null=True
OneToOne
关系不会超过一个,而不是
外键。猜测另一种方法是使用CourseMember查询和成员集合的计数进行注释,然后对注释进行筛选。快速提问,我如何使用成员而不是CourseMember来完成此操作?因此,我不做反向查找。然后您必须进行两次查询,一次是从成员模型中获取课程成员id,另一次是使用课程成员id获取课程成员数据,如“课程成员id=member.objects.values('course\U member')。注释(Count('id'))。筛选(id\u Count\u gt=1)。值列表('course\U member',flat=True)”从中可以获得课程成员id,使用这些id可以获得课程成员,如CourseMember.objects.filter(id\u in=course\u member\u id)