sqlite 为什么Meta类中的订购不起作用?

n1bvdmb6  于 2022-11-14  发布在  SQLite
关注(0)|答案(2)|浏览(164)

我制作了一个类似Twitter的社交网络,用户首先使用Django 3.1.7查看最新帖子。
我的模特:

class Post(models.Model):
    date_published = models.DateTimeField(auto_now_add=True)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.CharField(max_length=240, blank=False, default=None)
    user_like = models.ManyToManyField(User, blank=True, related_name='likes')

    def __str__(self):
        return f'{self.user.username} posted \"{self.content}\" on {self.date_published}'

    class Meta:
        ordering = ('-date_published',)

我从views.py查询数据库:

@login_required
def following(request):
    authors_followed = Follow.objects.filter(
        follower=request.user).values('author')

    posts = Post.objects.filter(user__in=authors_followed).annotate(
        likes=Count('user_like'))

    return render(request, "network/following.html", {
        'posts': posts
    })

但帖子并没有像预期的那样被订购。当指定.order_by('-date_published')时,它可以工作。为什么class Meta中的ordering不工作?我已经完成了所有迁移并迁移了数据库。ordering = ['-date_published']也不起作用。

von4xj4u

von4xj4u1#

我有两个型号:NameMixingSpecies,它们是从前者继承而来的。NameMixing提供了我想要排序的名称字段。NameMixing是抽象的。添加ordering = ['name']不起作用,将其添加到Species可以。
我在SpeciesNameMixing中都有一个Meta类。为了使Species应用来自NameMixing的所有Meta(抽象除外),您还必须在Meta类中应用继承,如文档中所述:
当创建抽象基类时,Django使您在基类中声明的任何Meta内部类都可以作为属性使用。如果子类没有声明自己的元类,它将继承父类的元类。如果子级想要扩展父级的Meta类,它可以将其子类化。
Django确实对抽象基类的Meta类进行了一次调整:在安装Meta属性之前,它设置了Abstrate=False。这意味着抽象基类的子类本身不会自动成为抽象类。要创建从另一个抽象基类继承的抽象基类,需要显式设置该子类的抽象=True。

bqujaahr

bqujaahr2#

每个字符串都是一个带有可选“-”前缀的字段名,表示降序。不带前导“-”的字段将按升序排列。使用字符串“?”随机点餐。
例如,要按pub_date字段升序排序,请使用以下命令:

ordering = ['pub_date']

要按发布日期降序排序,请使用以下命令:

ordering = ['-pub_date']

要先按发布日期降序排序,然后按作者升序排序,请使用以下命令:

ordering = ['-pub_date', 'author']

请在此处查找更多详细信息

相关问题