Django过滤器排除外键
问题内容:
我正在创建一个具有两个模型的新闻网站:
- 新闻
- 最佳新闻。
BestNews 具有 News 的外键。
新闻代表所有新闻,而BestNews代表推荐新闻。
现在我已经在index.html中呈现了新闻列表和最佳新闻列表。但是这两部分中的一些新闻是重复的。
我希望在“最佳新闻”列表中不会出现在“新闻”列表中的新闻,并且一旦我从“管理员”中的“最佳新闻”中删除了该新闻,从“最佳新闻”中删除的新闻就会出现在“新闻”列表中。
这是我的新闻模型:
class News(models.Model):
title = models.CharField(max_length=100, verbose_name='标题')
content = UEditorField(verbose_name="内容", width=600, height=300, imagePath="news/ueditor/", filePath="news/ueditor/", default='')
class Meta:
verbose_name = "新闻"
verbose_name_plural = verbose_name
def __str__(self):
return self.title
这是我的最佳新闻模型:
class Best(models.Model):
select_news = models.ForeignKey(News, on_delete=models.CASCADE, related_name='select_news',verbose_name='要闻')
SELECT_REASON = (
('左一', '左一'),
('左二', '左二'),
)
select_reason = models.CharField(choices=SELECT_REASON, max_length=50, null=False)
class Meta:
verbose_name = "精选"
verbose_name_plural = verbose_name
def __str__(self):
return self.select_reason + '-' + self.select_news.title
这是我的新闻列表视图:我在一个视图中获得新闻列表和最佳新闻列表。
class NewsView(View):
def get(self, request):
all_news = News.objects.all().order_by('-pk')
bestnews1 = Best.objects.filter(select_reason="左一")[0].select_news
bestnews2 = Best.objects.filter(select_reason="左二")[0].select_news
return render(request, 'index.html', {
'all_news': news,
'bestnews1':bestnews1,
'bestnews2':bestnews1,
})
问题答案:
all_news = News.objects.all().order_by('-pk')
至
all_news = News.objects.filter(select_news__isnull=True).order_by('-pk')
免费咨询:
更改
bestnews1 = Best.objects.filter(select_reason="左一")[0].select_news
至
bestnews1 = Best.objects.filter(select_reason="左一").first()
bestnews1_new = None if bestnew1 is None else bestnews1.select_news
return render(request, 'index.html', {
'all_news': news,
'bestnews1_new':bestnews1_new,
'bestnews2_new':bestnews2_new,
})