Найти - Пользователи
Полная версия: ManyToMany порядок
Начало » Django » ManyToMany порядок
1 2
LestatCheb
Здравствуйте.

Возникла такая проблема, есть 2 модели:

class Interest(models.Model):
name = models.CharField(max_length=255, verbose_name=u'Название', unique=True)
....

class Post(models.Model):
....
interests = models.ManyToManyField(Interest, blank=True, null=True)
....
создаю Post в базе и прописываю в нужном порядке интересы, т.е. например в базе потом в blog_post_interests вот такое:
id         post_id          interest_id
103 25461 68
104 25461 75
105 25461 54
потом в консоли получаю этот пост и гляжу интересы
p.interests.all().values_list('id', flat=True)
возвращает

а нужно чтобы возвращал в созданном порядке, т.е.


т.к. обычно в начале у нас указывают более значимые интересы, чем потом, а это важно для других вещей.

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

это как-то можно пофиксить?
куда копать?


Спасибо!
ziro
p.interests.all().order_by(…)?
LestatCheb
ziro
p.interests.all().order_by(…)?
вот загвоздка в том что order_by('id') указывает на interest_id, а не на id в таблице blog_post_interests
LestatCheb
можно конечно вручную через raw sql вытаскивать записи в нужном порядке, но это такой костыль.. тогда везде где идет взаимодействие интересов и постов нужно будет использовать свою функцию + админку тоже ковырять придется..

как-то это неправильно
LestatCheb
т.е. джанга генерирует запрос
SELECT * FROM “account_interest” U0 INNER JOIN “blog_post_interests” U1 ON (U0.“id” = U1.“interest_id”) WHERE U1.“post_id” = 25461
а нужно
SELECT * FROM “account_interest” U0 INNER JOIN “blog_post_interests” U1 ON (U0.“id” = U1.“interest_id”) WHERE U1.“post_id” = 25461 ORDER BY U1.“id”
ziro
Используйте промежуточную таблицу в явном виде - http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships
LestatCheb
ziro
Используйте промежуточную таблицу в явном виде - http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships
пробовал, не помогает.

добавлял в models:

class post_interests(models.Model):
interest = models.ForeignKey(Interest)
post = models.ForeignKey(Post)
чтобы указать на существующую в базе таблицу blog_post_interests


менял Post так:

class Post(models.Model):
....
interests = models.ManyToManyField(Interest, blank=True, null=True, through='post_interests')
....
и в админке и в p.interests.all() порядок не изменился.

хм, или что-то еще надо сделать?
LestatCheb
пробовал так:

class post_interests(models.Model):
interest = models.ForeignKey(Interest)
post = models.ForeignKey(Post)
order = models.PositiveIntegerField()

class Meta:
ordering = ['order']
скопировал в промежуточной таблице id в order.

p.interests.all().order_by('order')
выдает ошибку

FieldError: Cannot resolve keyword 'order' into field.
freemon
Как по мне проще добавить поле для таймштампа:
class Interest(models.Model):
name = models.CharField(max_length=255, verbose_name=u'Название', unique=True)
pub_date = models.DateField(auto_now_add=True)

class Meta:
ordering = ['pub_date']
LestatCheb
freemon
Как по мне проще добавить поле для таймштампа:
class Interest(models.Model):
name = models.CharField(max_length=255, verbose_name=u'Название', unique=True)
pub_date = models.DateField(auto_now_add=True)

class Meta:
ordering = ['pub_date']
не, тут надо не Interest сортировать :) так можно и по id их отсортировать, это не то )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB