0

我有一个模型,它通过一个名为 person 的外键与另一个模型有关系。模型看起来像:

class PR(models.Model):
    p_keyid   = models.IntegerField(primary_key=True)
    r_no      = models.IntegerField(null=True, blank=True)
    person    = models.ForeignKey('person.Person', db_column = 'person_no')
    recall_dt = models.DateTimeField(null=True, blank=True)

    class Meta:
        managed  = False
        db_table = 'person_r'

请注意,“托管”元是错误的(它不是我创建的表)。

有时表中存在不存在的person_no值。person_r例如,aPR.person的值为 232。但是,id 为 232 的人不存在(外键指向不存在的对象)。如何过滤这些糟糕的 PR 实例?

在我看来,我有这个:

 r_for_date = PR.objects.filter(recall_dt__range = (startdate, enddate) 

我确实想r_for_date包含不存在的人员属性的记录(在上面的示例中,不应显示人员 ID 为 232 的记录)。

4

2 回答 2

1

这是我会做的..

valid_people_ids = Person.objects.all().values_list('id', flat=True)
bad_pr_people = PR.objects.exclude(person_id__in=valid_people_ids)

希望有帮助。

于 2013-07-18T03:59:24.733 回答
0

我建议该解决方案将帮助您:

r_for_date = PR.objects.filter(person__id__isnull=False,recall_dt__range = (startdate, enddate))

因为person__id属于person表。

但是当您在管理器中定义此过滤器时会更好

class PRManager(models.Manager):
def get_queryset(self):
    return super(PRManager, self).get_queryset().filter(person__id__isnull=False)

这允许您不添加person__id__isnull=False到每个过滤器。希望对你有帮助。请在您尝试后告诉我结果。

于 2013-07-18T04:53:49.097 回答