Я исключаю объекты со значением None, но все они возвращаются, почему?
Я использую функцию, чтобы получить URL и избежать ссылки, если внешний ключ (cve) отсутствует.
def get_absolute_url(self):
try:
return reverse('detail', args=[self.cve, self.id)
except NoReverseMatch:
pass
Но там, где я использую эти URL, я также фильтрую, чтобы исключить, когда fk - None.
class VSitemap(Sitemap):
def items(self): return Vuln.objects.exclude(cve__in=[]).exclude(cve=None)
Таким образом, я получаю следующее:
<url>
<loc>https://example.ioNone</loc>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://example.ioNone</loc>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://example.ioNone</loc>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://example.ioNone</loc>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://example.ioNone</loc>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
</url>
Все, что я получаю, не является таковым, даже если я фильтрую слишком много.
Причина, по которой это происходит, заключается в том, что последовательно возникает ошибка NoReverseMatch
. Вероятно, это связано с тем, что self.cve
является объектом ForeignKey
, и поэтому не может быть сериализован должным образом.
Тем не менее, ловить такие исключения - не хорошая идея: теперь исключение не будет заноситься в журнал, и, следовательно, ошибка останется невысказанной, а значит, ее трудно будет исправить.
Вероятно, вам следует работать с:
def get_absolute_url(self):
return reverse('detail', args=(self.cve_id, self.pk))
Если вы определили app_name
в urls.py
, то это:
def get_absolute_url(self):
return reverse('app_name:detail', args=(self.cve_id, self.pk))