用于多个结果的 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))