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.
这是一个非常困难的情况,我甚至无法检查这个案例是否会绕过它。
答案 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。