如何在Django中维护一对多关系的插入顺序?

问题描述 投票:4回答:4

如何用一对多的Django映射来维护插入顺序,比如:说我们有。

class Person(models.Model):
    name = Model.CharField(max_length=50)

class Subject(models.Model):
    sub_name = Model.CharField(max_length=50)
    person = Model.ForeignKey('Person')

def insert_data():
    person = Person.objects.create(name='Deepan')
    Subject(name='Eng', person=person).save()
    Subject(name='Sci', person=person).save()

Subject.objects.filter(person=person) # is there a way to make this to always return the subjects in the inserted order, i.e Eng, Sci instead of Sci, Eng

在hibernategrails中使用列表类型来处理这个问题。

django django-orm
4个回答
4
投票

使用元信息定义排序。

class Subject(models.Model):
    sub_name = models.CharField(max_length=50)
    person = models.ForeignKey('Person')
    time = models.DateTimeField(auto_now_add = True)

    class Meta:
        ordering = ['time'] #or ['-time'] according to the ordering you require

这将在时间字段中保存创建日期时间,因此结果将根据加时来排序。

顺便说一下(如果有其他原因),从你的模型来看,似乎会有很多个 Persons 还有很多 Subjects 所以我建议使用 诸多领域. 这将把多个用户映射到多个主体上,并对称回传。您甚至可以使用 through 选项,以存储更多的细节(时间等分类,如果你需要,甚至可以存储记录的标记百分比),每一个 Person-Subject 映射。


1
投票

你需要使用一个元类来一直排序,并使用日期时间字段,将auto_now选项设置为True。我建议使用代理类进行排序。排序是一个昂贵的操作。请看 这个环节 更多关于分类和 这个环节 关于代理模式。


1
投票
class Meta:
    ordering = ['id']

而且不需要额外的字段。Django模型总是有'id'字段。


0
投票

我正在寻找完全相同的和 order_with_respecto_to 工作。

class Game(models.Model):
    title = models.CharField(max_length=255)

class Task(models.Model):
    title = models.CharField(max_length=255)
    game = models.ForeignKey(Game, on_delete=models.CASCADE)

    class Meta:
        order_with_respect_to = 'game'

你可以看到原来的顺序,因为他们在哪里插入,你可以修改它,如果你想。你也可以得到下一个寄存器的顺序

>>> from prueba.models import Game,Task
>>> a=Game.objects.get(id=1)
>>> a.get_task_order()
<QuerySet [1, 2, 3]>
>>> a.set_task_order([3,2,1])
>>> a.get_task_order()
<QuerySet [3, 2, 1]>
>>> t=Task.objects.get(id=2)
>>> t.get_next_in_order()
<Task: task1>
>>> t=Task.objects.get(id=3)
>>> t.get_next_in_order()
<Task: task2>

以下是文档https:/docs.djangoproject.comen3.0refmodelsoptions#-with-respect-to。

© www.soinside.com 2019 - 2024. All rights reserved.