用于多个结果的 Django ORM filter()
Django ORM filter() for multiple results
我有以下型号:
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()
class Case(models.Model):
sn = models.CharField(max_length=100, verbose_name=_('Serial number'))
user = models.ForeignKey('users.User', on_delete=models.PROTECT, related_name='cases')
class FullVector(models.Model):
full_feature_vector = models.BinaryField()
version = models.FloatField()
processed_on = models.DateTimeField()
case = models.ForeignKey(Case, on_delete=models.CASCADE, related_name='full_vectors')
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)
现在,这种关系允许这样的情况,即来自 FullVector 模型的多个条目指向同一个 Case 条目。而且,总是有不止1个ShortVector入口指向同一个FullVector入口,并且总是有一个Prediction入口指向每个ShortVector入口。
Example:
Case --> FullVector1 --> ShortVector1 --> Prediction1
| |-> ShortVector2 --> Prediction2
| |-> ShortVector3 --> Prediction3
| \-> ShortVector4 --> Prediction4
|
\-> FullVector2 --> ShortVector5 --> Prediction5
|-> ShortVector6 --> Prediction6
|-> ShortVector7 --> Prediction7
\-> ShortVector8 --> Prediction8
我需要编写一个 Django ORM 查询,它会检查每个 DisputeAssignment 条目是否与其关联的所有预测条目(通过 Case -> 不同的 FullVector 和 ShortVector 条目)具有 verif_req 值,这大于-1.
我从这个开始:
DisputeAssignments.objects.filter(case_id__full_vectors__short_vectors__predictions__verif_req__gt=-1)
但是上面的方法失败了,例如FullVector1 相关预测的特征全为 0,而 FullVector2 相关的预测特征全为 -1。我希望这种情况会导致遗漏此 DisputeAssignment 条目,但由于 FullVector1 相关条目满足 verif_req > -1.
的要求,它留在了 QuerySet 中
I need to write a Django ORM query, which for each DisputeAssignment
entry will check, if ALL Prediction entries associated with it
(through Case -> different FullVector and ShortVector entries), have
verif_req value, which is greater than -1.
你可以得到 DisputeAssignments
where verif_req
is not <= -1 with Q
from django.db.models import Q
DisputeAssignments.objects.filter(~Q(case_id__full_vectors__short_vectors__predictions__verif_req__lte=-1))
我有以下型号:
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()
class Case(models.Model):
sn = models.CharField(max_length=100, verbose_name=_('Serial number'))
user = models.ForeignKey('users.User', on_delete=models.PROTECT, related_name='cases')
class FullVector(models.Model):
full_feature_vector = models.BinaryField()
version = models.FloatField()
processed_on = models.DateTimeField()
case = models.ForeignKey(Case, on_delete=models.CASCADE, related_name='full_vectors')
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)
现在,这种关系允许这样的情况,即来自 FullVector 模型的多个条目指向同一个 Case 条目。而且,总是有不止1个ShortVector入口指向同一个FullVector入口,并且总是有一个Prediction入口指向每个ShortVector入口。
Example:
Case --> FullVector1 --> ShortVector1 --> Prediction1
| |-> ShortVector2 --> Prediction2
| |-> ShortVector3 --> Prediction3
| \-> ShortVector4 --> Prediction4
|
\-> FullVector2 --> ShortVector5 --> Prediction5
|-> ShortVector6 --> Prediction6
|-> ShortVector7 --> Prediction7
\-> ShortVector8 --> Prediction8
我需要编写一个 Django ORM 查询,它会检查每个 DisputeAssignment 条目是否与其关联的所有预测条目(通过 Case -> 不同的 FullVector 和 ShortVector 条目)具有 verif_req 值,这大于-1.
我从这个开始:
DisputeAssignments.objects.filter(case_id__full_vectors__short_vectors__predictions__verif_req__gt=-1)
但是上面的方法失败了,例如FullVector1 相关预测的特征全为 0,而 FullVector2 相关的预测特征全为 -1。我希望这种情况会导致遗漏此 DisputeAssignment 条目,但由于 FullVector1 相关条目满足 verif_req > -1.
的要求,它留在了 QuerySet 中I need to write a Django ORM query, which for each DisputeAssignment entry will check, if ALL Prediction entries associated with it (through Case -> different FullVector and ShortVector entries), have verif_req value, which is greater than -1.
你可以得到 DisputeAssignments
where verif_req
is not <= -1 with Q
from django.db.models import Q
DisputeAssignments.objects.filter(~Q(case_id__full_vectors__short_vectors__predictions__verif_req__lte=-1))