【问题标题】:Django - How to set default ordering on ManyToMany field querysetDjango - 如何在多对多字段查询集上设置默认排序
【发布时间】:2022-01-17 19:26:31
【问题描述】:

我有以下型号:

class Hashtag(models.Model):
    ...
    created = models.DateTimeField(auto_now_add=True)
    ...

class Tweet(models.Model):
    ...
    hashtags = models.ManyToManyField(
        to='Hashtag',
        through='TweetHashtag',
        through_fields=('tweet', 'hashtag'),
    )
    ...


class TweetHashtag(models.Model):
    comment = models.ForeignKey(
        to='Tweet',
        on_delete=models.CASCADE,
    )
    hashtag = models.ForeignKey(
        to='Hashtag',
        on_delete=models.CASCADE,
        related_name="tweets"
    )
    created = models.DateTimeField(auto_now_add=True)

我的问题是当我收到一条推文时,我想按创建的顺序获取主题标签。

tweet = Tweet.objects.get(id=1)
hashtags = list(tweet.hashtags.all())

当我查看hashtags 时,我发现主题标签的顺序不正确。我想通过through_model.created 获得tweet.hashtags 的订单(createdTweetHashtag 模型。)

还有吗? 我有一个想法,但我不知道该怎么做。这个想法是在 Tweet 模型中覆盖 hashtags 的关系管理器。

有什么办法吗?

【问题讨论】:

    标签: django django-rest-framework django-orm django-managers drf-queryset


    【解决方案1】:

    您可以通过.order_by(…) [Django-doc] 订购HashTags:

    tweet = Tweet.objects.get(id=1)
    hashtags = list(tweet.hashtags.order_by('tweethashtag__created'))

    【讨论】:

    • 我需要将此tweethashtag__created 设置为tweet.hashtags.all() 的默认排序。有可能吗?
    • @msln: 不,您不能指定默认排序:访问ManyToManyField 的项目时忽略直通模型的排序。
    猜你喜欢
    • 2011-04-07
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多