如何检查不再存在的ForeignKey?

时间:2014-11-27 10:00:51

标签: python django

class PersonSite(models.Model):
    vps_id             = models.AutoField(primary_key=True)
    person             = models.ForeignKey(CanonPerson, db_column='p_id',null=True)
    site               = models.ForeignKey(CanonSite, db_column='s_id',null=True)

person_sites = PersonSite.objects.filter(person=cp)
for person_site in person_sites:
    if person_site and person_site.site_id and person_site.site.s_id:
       # crashes for some records

我们遇到了数据问题,其中PersonSite可能指向不再存在的site。 在调试器中,我可以看到person_site.site_id的值为5579,但该数据库中不存在该ID:

select * from tbl_vpd_sites where s_id = 5579

因此person_site.site_id不为空,但只是在条件中访问person_site.site会使应用消息崩溃:

DoesNotExist: CanonSite matching query does not exist.

这是一个非常困难的情况,我甚至无法检查这个案例是否会绕过它。

1 个答案:

答案 0 :(得分:1)

PersonSite.site有null=True,因此在访问对象之前必须检查对象是否存在。

您可以只查询数据库并过滤掉空站点,而无需执行所有这些检查if person_site and person_site.site_id and person_site.site.s_id:

person_sites = PersonSite.objects.filter(person=cp).filter(site__isnull=False)

这将仅返回网站IS NOT NULL的PersonSite对象,因此具有pk。