Порядок объявления имеет значение в models.py (Django / Python)?

Вам необходимо сначала упорядочить по номеру вхождения desc и по номеру строки по asc.

select name,rn 
from
(
    select name,row_number() over(partition by name order by name) rn ,
    count(*) over(partition by name) ct
    from tbl_dup
) a
order by ct desc, rn asc
5
задан Wtower 5 March 2015 в 16:05
поделиться

6 ответов

Да, порядок имеет значение, как отметили другие.

Тем не менее, столкновение с этой проблемой почти всегда будет свидетельством того, что вы делаете что-то не так.

В этом случае ваше заявление:

cities = City.objects.filter(zip=self).distinct()

... является избыточным и плохой практикой. Вы можете найти города, связанные с почтовым индексом, ссылаясь на city_set этого почтового индекса в своих представлениях (т.е. не в вашей модели!). Поэтому, если zip является экземпляром ZipCode, вы должны сделать:

cities = zip.city_set.all()

Если вы действительно хотите называть его «города», а не «city_set», вы можете использовать параметр related_name в объявлении m2m.

3
ответ дан 12 December 2019 в 21:15
поделиться

Помимо проблем порядка, это неправильно:

cities = City.objects.filter(zip=self).distinct()

Он не внутри метода, поэтому «я» также будет неопределенным. Он выполняется только один раз, во время создания класса (т.е. когда модуль впервые импортируется), поэтому созданный атрибут будет атрибутом класса и будет иметь одинаковое значение для всех экземпляров. То, что вы могли бы искать, это:

@property
def cities(self):
  return City.objects.filter(zip=self).distinct()

Поскольку это внутри метода, который не выполняется до тех пор, пока к нему нет доступа, проблемы с заказом больше не будут проблемой. Как указывает Озан, это дублирование того, что обратные отношения в Django уже дают вам бесплатно:

a_zip_code.city_set.all()

И вы можете использовать related_name, чтобы называть его так, как вам нравится:

zip = models.ManyToManyField(ZipCode, related_name='cities')
...
a_zip_code.cities.all()

Так что я не думаю, что проблема заказа, которую вы изначально задавали о даже имеет отношение к вашей ситуации. Когда он является,

6
ответ дан 12 December 2019 в 21:15
поделиться

Когда-то я беспокоился о заказе ... потому что я думал, что мои модели ниже могут ссылаться только на модели выше. Но потом понял, что можно просто сделать

models.ForeignKey('appName.modelName')

и все было хорошо.

3
ответ дан 12 December 2019 в 21:15
поделиться

Когда у вас есть ссылки на классы, определенные после, вы можете использовать этот трюк:

attribute = models.ForeignKey('ClassDefinedAfterThis')
5
ответ дан 12 December 2019 в 21:15
поделиться

Порядок имеет значение в Python. Эта тема может иметь отношение к вашему вопросу. Также для ваших нужд вы можете использовать уникальный внешний ключ в классе почтового индекса.

0
ответ дан 12 December 2019 в 21:15
поделиться

Да, порядок имеет значение, но ваш пример мне не подходит. Я думаю, что вы должны просто использовать внешний ключ для ваших отношений «многие к одному»:

cities = models.ForeignKey(City)

Здесь есть подробности по отношениям «многие к одному» с моделями django.

Редактировать:

Мне было указано в комментариях, что в городах Европы может быть несколько городов с одинаковым почтовым индексом. Если вы ищете здесь отношение «многие ко многим», вы должны использовать:

cities = models.ManyToManyField(City)

Это описано в документации Django . Дело в том, что любой из этих примеров гораздо более понятен, чем то, что используется в этом примере.

2
ответ дан 12 December 2019 в 21:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: