Python 用于多个结果的Django ORM筛选器()
我有以下型号:Python 用于多个结果的Django ORM筛选器(),python,django,django-orm,Python,Django,Django Orm,我有以下型号: class DisputeAssignments(models.Model): case_id = models.ForeignKey(Case, on_delete=models.CASCADE, related_name='dispute_assigned_to') user_id = models.ForeignKey('users.User', on_delete=models.CASCADE, blank=False, null=False, relat
class DisputeAssignments(models.Model):
case_id = models.ForeignKey(Case, on_delete=models.CASCADE, related_name='dispute_assigned_to')
user_id = models.ForeignKey('users.User', on_delete=models.CASCADE, blank=False, null=False, related_name='assigned_disputes')
assignment_date = models.DateTimeField()
现在,这种关系允许出现以下情况:来自FullVector模型的多个条目指向同一个案例条目。此外,总是有多个短向量条目指向同一个FullVector条目,并且总是有一个预测条目指向每个短向量条目
Example:
Case --> FullVector1 --> ShortVector1 --> Prediction1
| |-> ShortVector2 --> Prediction2
| |-> ShortVector3 --> Prediction3
| \-> ShortVector4 --> Prediction4
|
\-> FullVector2 --> ShortVector5 --> Prediction5
|-> ShortVector6 --> Prediction6
|-> ShortVector7 --> Prediction7
\-> ShortVector8 --> Prediction8
我需要编写一个Django ORM查询,对于每个DisputeAssignment条目,该查询将检查通过Case->different FullVector和ShortVector条目与之关联的所有预测条目是否具有大于-1的verif_req值
我从这个开始:
DisputeAssignments.objects.filter(case_id__full_vectors__short_vectors__predictions__verif_req__gt=-1)
但是上述方法失败了,例如,如果FullVector1相关的预测功能全部为0,而FullVector2相关的预测功能全部为-1。我希望这种情况会导致忽略此DisputeAssignment条目,但由于FullVector1相关条目满足verif_req>-1的要求,因此它被保留在QuerySet中
我需要编写一个Django ORM查询,为每个DisputeAssignment
条目将检查是否所有与之关联的预测条目
通过大小写->不同的FullVector和ShortVector条目
verif_req值,大于-1
您可以在verif_req没有很好工作的地方获得争议,谢谢。你能解释一下它是怎么工作的吗?在我看来,我需要一个递归地对每个结果应用过滤器的查询。Django的网页并没有将Q表达式的操作描述为递归查询,而更像是不同过滤器表达式的包装器,可以使用AND/OR运算符链接。Q表达式还提供了在过滤时使用not with~运算符的机会。在你的情况下,它只是一个没有条件的过滤器。嗯,好吧,但是在我的例子中,否定查询结果的能力给了我们什么呢?很抱歉,我在这里遇到了一个非常尴尬的时刻,但我不知道询问哪些案例与小于等于-1的预测相关联如何为我的问题带来一个正确的结果:您正在筛选DisputeAssignments对象,如果DisputeAssignments对象的相关Case->FullVector->ShortVector->Prediction不符合条件,那么这个DisputeAssignments对象将不会进入过滤结果,依此类推。啊,现在就得到了。谢谢
class ShortVector(models.Model):
id = models.BigAutoField(primary_key=True)
detailed_fv_version = models.BinaryField()
full_vector = models.ForeignKey(FullVector, on_delete=models.CASCADE, related_name='short_vectors')
short_vector = models.BinaryField(null=True)
class Prediction(models.Model):
id = models.BigAutoField(primary_key=True)
short_vector = models.ForeignKey(ShortVector, on_delete=models.CASCADE, related_name='predictions', null=True, default=None)
verif_req = models.SmallIntegerField(default=1)
Example:
Case --> FullVector1 --> ShortVector1 --> Prediction1
| |-> ShortVector2 --> Prediction2
| |-> ShortVector3 --> Prediction3
| \-> ShortVector4 --> Prediction4
|
\-> FullVector2 --> ShortVector5 --> Prediction5
|-> ShortVector6 --> Prediction6
|-> ShortVector7 --> Prediction7
\-> ShortVector8 --> Prediction8
DisputeAssignments.objects.filter(case_id__full_vectors__short_vectors__predictions__verif_req__gt=-1)
from django.db.models import Q
DisputeAssignments.objects.filter(~Q(case_id__full_vectors__short_vectors__predictions__verif_req__lte=-1))