【问题标题】:Order many-to-many field by the order values were inserted按插入的顺序值排序多对多字段
【发布时间】:2021-04-29 10:15:38
【问题描述】:
# models.py
from django.contrib.auth.models import User
# Create your models here.
class Profile(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    avatar = models.ImageField(upload_to=avatar_photo_upload, blank=True)
    banner = models.ImageField(upload_to=banner_photo_upload, blank=True)

    bio = models.TextField(max_length=150, blank=True)

    date_joined = models.DateField(auto_now_add=True)
    time_joined = models.TimeField(auto_now_add=True)

    def __str__(self) -> str:
        return self.user.username

class Friend(models.Model):
    # The friends, sender first, reciever second
    friends = models.ManyToManyField(Profile)

    # accepted or rejected
    accepted = models.BooleanField(default=False)
    rejected = models.BooleanField(default=False)

    date_added = models.DateField(auto_now=True)
    time_added = models.TimeField(auto_now=True)

    def __str__(self):
        if self.accepted == False and self.rejected == False:
            return f'{" sent a request to ".join([i.user.username for i in self.friends.all()])}'
        else:
            if self.accepted == True and self.rejected == True:
                return f'{" was a friend of ".join([i.user.username for i in self.friends.all()])}'
            elif self.accepted == True and self.rejected == False:
                return f'{" is a friend of ".join([i.user.username for i in self.friends.all()])}'
            else:
                return f'{" was rejected as a friend by ".join([i.user.username for i in self.friends.all()])}'

friends 字段是many-to-many field, 用一个例子来理解我的问题:

例如 -> Profile 对象a 被创建,然后 Profile 对象b。 现在我在friend 字段中添加配置文件对象b,然后在a 中添加对象,但是friend 字段将它们排序在a 然后b...

如何按添加时间排序。

谢谢。

编辑:

预期输出:插入值的顺序相同。

【问题讨论】:

  • 也请与我们分享Profile 模型。
  • 我已经编辑并添加了 Profile 模型。
  • 很好,那么order_by 是你的朋友。 docs.djangoproject.com/en/3.2/ref/models/querysets/… 您可以使用类似YOUR_MODEL_NAME.objects.filter(FILTER_FIELDS).order_by("-profile__date_joined") 的东西按 date_joined 降序排列。
  • 我无法明确我的问题,我想要的是按添加时间对字段进行排序,这意味着 - 添加 b 然后添加 a 我希望订单是 @ 987654338@,添加它的顺序与输出的顺序应该是......非常抱歉给您带来不便。

标签: django manytomanyfield


【解决方案1】:

Django Many To Many Insert Ordering

Django 不保证保留多对多关系的顺序。如果你需要这个,你应该使用一个带有明确“订单”字段的直通表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    相关资源
    最近更新 更多