如何过滤掉外键指向的不存在的对象

时间:2013-07-18 02:41:19

标签: django django-models

我的模型通过名为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值不存在。例如,PR.person的值为232.但是,id为232的人不存在(外键指向不存在的对象)。如何过滤 out 这样糟糕的PR实例?

在我看来,我有这个:

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

我确实希望r_for_date包含不存在person属性的记录(在上面的例子中,那个人ID为232的记录不应该出现)。

2 个答案:

答案 0 :(得分:0)

这是我要做的......

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

希望有所帮助。

答案 1 :(得分: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。希望能帮助你。尝试此操作后请告诉我结果。