如何用一对多的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中使用列表类型来处理这个问题。
使用元信息定义排序。
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
映射。
class Meta:
ordering = ['id']
而且不需要额外的字段。Django模型总是有'id'字段。
我正在寻找完全相同的和 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。