Как сохранить порядок вставки для отношений один-ко-многим в Django - PullRequest
3 голосов
/ 28 декабря 2010

Как сохранить порядок вставки с отображением 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

Ответы [ 3 ]

4 голосов
/ 28 декабря 2010

Определите порядок, используя метаинформацию:

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.

2 голосов
/ 28 декабря 2010
class Meta:
    ordering = ['id']

И никаких дополнительных полей не требуется. Модель Django всегда имеет поле 'id'.

1 голос
/ 28 декабря 2010

Вам нужно использовать метакласс, чтобы всегда сортировать его, и использовать поле даты и времени с опцией auto_now, установленной в True.
Я рекомендую использовать прокси-класс для сортировки.Сортировка - это дорогостоящая операция.
См. эту ссылку для получения дополнительной информации о сортировке и эту ссылку на моделях прокси.

...