Я исключаю объекты со значением 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))
Вернуться на верх