【问题标题】:Adding ManyToManyField in correct order [duplicate]以正确的顺序添加 ManyToManyField [重复]
【发布时间】:2013-06-27 06:31:02
【问题描述】:

我面临一个有趣的问题,我不知道它是否是一个问题,但它没有给出我需要的预期值。以我的两个模型为例。

class Name(models.Model):
    """ """
    name = models.CharField(max_length=20)


class Dir(models.Model):
    name = models.ForeignKey(Name)
    children = models.ManyToManyField('Dir', null=True, blank=True, related_name="dirs")

例如,我在子目录“A”、“B”中添加了两个目录。现在我想以我添加的相同顺序取回我的两个孩子。但问题是,它按以下顺序提供给我。 'B','A'。如何保持订单与我添加的完全相同?

【问题讨论】:

  • 由于 Django 不能保证在 m2m 字段中保留插入顺序,因此您必须创建一个 through 表并在那里定义顺序。
  • 谢谢。但是我怎么能在这里使用,因为模型和它的孩子有相同的名字 'Dir' ?我试过但不能真正理解如何制作。
  • 你试过了吗? class DirEntry(models.Model): parent = models.ForeignKey(Dir) child = models.ForeignKey(Dir) order = models.IntegerField() 但对我来说,ManyToManyFieldthrough 有太多限制 - 例如。没有add()create() 方法和管理器将不起作用(我的意思是重新定义Dir.objects 并带有一些过滤器)- 最好只使用外键的中间模型。
  • 感谢 HighCat。我通过添加另一个字段“dir_id”解决了我的问题。看我下面的cmets。

标签: python django manytomanyfield


【解决方案1】:

您可以按关系标识符对目录进行排序:

parent = Dir(name='parent')
parent.dirs.add(Dir(name='A'))
parent.dirs.add(Dir(name='B'))
children = Dir.dirs.all().order_by('id') # or '-id' if you need reverse order.

仅当您使用through 属性定义中间表时。

【讨论】:

  • 插入 id 有时不会在我的模型结构中给出预期的输出,但这是很好的提示,谢谢。现在我定义了自己的 'dir_id' 字段,并在插入值期间以正确的顺序分配值。现在我可以看到正确的输出了。
  • 我在中间模型上使用了 created=models.DateTimeField(auto_now_add=True) 来了解插入顺序。然后我可以使用 .order_by('created')
猜你喜欢
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-20
  • 2023-03-04
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
相关资源
最近更新 更多