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

时间:2010-12-28 09:31:58

标签: django django-orm

如何使用一对多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

使用hibernate / grails中的列表类型

来处理

4 个答案:

答案 0 :(得分: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

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

btw(如果有其他原因)你的模型似乎会有很多Persons和很多Subjects所以我建议使用many to many fields。这会将多个用户映射到多个主题并对称地返回。根据{{​​1}} - Person映射,您甚至可以使用through选项存储更多详细信息(用于排序的时间等,甚至是在需要时存储记录的标记/百分比)。

答案 1 :(得分:2)

class Meta:
    ordering = ['id']

不需要其他字段。 Django模型总是有'id'字段。

答案 2 :(得分:1)

您需要使用元类来对其进行排序并使用日期时间字段并将auto_now选项设置为True。 我建议使用代理类进行排序。分拣是一项昂贵的操作 有关排序和this link代理模型的详细信息,请参阅this link

答案 3 :(得分:0)

我一直在寻找完全一样的东西,并且from sklearn.svm import SVR from sklearn import cross_validation as CV reg = SVR(C=1., epsilon=0.1, kernel='rbf') scores = CV.cross_val_score(reg, X, y, cv=10, scoring='neg_mean_squared_error') 可以工作:

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'

这里是文档 https://docs.djangoproject.com/en/3.0/ref/models/options/#order-with-respect-to