【问题标题】:Django: Ordering by the datetime of many to many model and the datetime of model itselfDjango:按多对多模型的日期时间和模型本身的日期时间排序
【发布时间】:2016-05-13 18:20:51
【问题描述】:

我想先按 NoteReposter 模型(中介)的 date_added (DateTime) 对笔记对象进行排序,如果它为空,则对其进行排序由 Note 模型本身的 date_created (DateTime)

这是我迄今为止在我的观点中所做的。py

user = NotepikUser.objects.get(pk=1)

# Combie the notes reposted and notes created of user
notes = Note.objects.filter(Q(notereposter__user=user) | Q(author=user))
notes = notes.order_by("-notereposter__date_added", "-date_created")

在我的 models.py 中

笔记模型

class Note(models.Model):
    note = models.CharField(max_length=2100)
    date_modified = models.DateTimeField(auto_now=True, blank=True)

    # If the notereposter__date_added is null then sort it using this datetime field
    date_created = models.DateTimeField(auto_now_add=True)

    author = models.ForeignKey('NotepikUser',
        related_name="%(class)ss_created")

    reposters = models.ManyToManyField('NotepikUser', through="NoteReposter", 
        related_name="%(class)ss_reposted", blank=True)

    categories = models.ManyToManyField('Category', blank=True, 
        related_name='notes')

NoteReposter 模型(中介)

class NoteReposter(models.Model):
    note = models.ForeignKey("Note", on_delete=models.CASCADE)
    user = models.ForeignKey("NotepikUser", on_delete=models.CASCADE)
    date_modified = models.DateTimeField(auto_now=True, blank=True)

    # Sort by this datetime field first
    date_added = models.DateTimeField(auto_now_add=True)

很遗憾,我的解决方案没有正确排序

谢谢!

编辑

someone created note1 (Note)
note1 date_created is 2016 January 1, 5:00 PM

User2 created note2
note2 date_created is 2016 January 1, 5:30 PM

User2 reposted note1 (note of someone)
notereposter1 (NoteReposter instance) created with user = User2,
             note=note1, date_added = 2016 January 1, 6:00 PM

User2 created note3
note3 date_created is 2016 January 1, 6:30 PM

我想要这样排序的笔记

<note3> 6:30 PM,
<notereposter1.note> 6:00pm 
<note2> 5:30pm

【问题讨论】:

  • 不相关:为什么将相关模型作为字符串传递?例如...ManyToManyField('NotepikUser'... 而不是 ...ManyToManyField(NotepikUser,... ?有用吗?
  • 你的解决方案有什么问题?
  • I want to sort the notes objects by date_added (DateTime) of NoteReposter model (intermediary)。这有什么意义吗?这是一个多对多关系:每个笔记有多个用户,即每个笔记有多个 NoteReposter 条目。您想如何使用它们对笔记进行排序?例如按最新的 NoteReposter 对笔记进行排序?
  • @Pynchia 是的,它正在工作。我将它作为字符串传递,因为尚未定义 NotepikUser 模型。 [stackoverflow.com/questions/18303406/… -Raz 排序不对
  • 您没有在 NoteReposter 中为 Note FK 指定相关名称。应该是note_reposters。而你的查询应该是notes.order_by("-note_reposters__date_added", "-date_created")

标签: python mysql django django-models


【解决方案1】:

我现在明白了。对于那些感兴趣的人,这是我的解决方案。

from django.db.models import DateTimeField, F, Case, When
notes.annotate(newest_in_vault=Case(When(notereposter__isnull=False,
        then=F("notereposter__date_added")), default=F("date_created"),
        output_field=DateTimeField()))
# Sort it now
notes = notes.order_by("-newest_in_vault")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多