按模型B对模型A进行排序,返回重复项
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按模型B对模型A进行排序,返回重复项相关的知识,希望对你有一定的参考价值。
我有模型称为游戏,有很多帖子由模型帖子连接。当我按照模型帖子对游戏进行排序时,它会从模型游戏返回重复项。我想知道如何在最近的发布日期显示游戏而不返回重复项。
views.朋友
from django.shortcuts import render, get_object_or_404
from library.models import Game
from .models import Post
from django.views.generic import (
ListView,
DetailView
)
# Create your views here.
def home(request):
context = {
'recent': Game.objects.all().order_by('-post__date_published')[:5],
'posts': Post.objects.all(),
}
return render(request, 'main/home.html', context)
class TitlePostListView(ListView):
model = Post
template_name = 'main/title_posts.html'
context_object_name = 'posts'
paginate_by = 5
def get_queryset(self):
title = get_object_or_404(Game, title=self.kwargs.get('title'))
return Post.objects.filter(game=title).order_by('-date_published')
def get_context_data(self, **kwargs):
context = super(TitlePostListView, self).get_context_data(**kwargs)
context['game'] = get_object_or_404(Game, title=self.kwargs.get('title'))
return context
class PostDetailView(DetailView):
model = Post
models.朋友
class Post(models.Model):
article_title = models.CharField(max_length=100, default="Article Title Place Holder")
content = HTMLField(default="Article Content Pace Holder")
date_published = models.DateTimeField(default=timezone.now)
game = models.ForeignKey('library.Game', on_delete=models.CASCADE)
article_image = models.ImageField(default='/media/default.png')
class Game(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
cover = models.ImageField()
cover_display = models.ImageField(default='default.png')
developer = models.CharField(max_length=100)
答案
你在这里寻找的是distinct()
。
Game.objects.all().order_by('-post_set__date_published').distinct()[:5]
我也没有看到你在哪里连接Post
和Game
,所以我假设你在其他一些你没有发布的代码中这样做,并且你当前的order_by
正在工作。
以上是关于按模型B对模型A进行排序,返回重复项的主要内容,如果未能解决你的问题,请参考以下文章
按模型的属性(不是字段)对 Django QuerySet 进行排序
linux bash按'yymmdd'而不是'ddmmyy'列格式对文本文件进行排序,然后按时间排序,然后删除重复项