Уведомления

Группа в Telegram: @pythonsu

#1 Март 4, 2011 13:38:13

LestatCheb
От:
Зарегистрирован: 2009-06-09
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

ManyToMany порядок

Здравствуйте.

Возникла такая проблема, есть 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)
возвращает

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


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

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

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


Спасибо!



Офлайн

#2 Март 5, 2011 12:11:18

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

ManyToMany порядок

p.interests.all().order_by(…)?



Офлайн

#3 Март 5, 2011 12:42:04

LestatCheb
От:
Зарегистрирован: 2009-06-09
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

ManyToMany порядок

ziro
p.interests.all().order_by(…)?
вот загвоздка в том что order_by('id') указывает на interest_id, а не на id в таблице blog_post_interests



Офлайн

#4 Март 5, 2011 12:43:25

LestatCheb
От:
Зарегистрирован: 2009-06-09
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

ManyToMany порядок

можно конечно вручную через raw sql вытаскивать записи в нужном порядке, но это такой костыль.. тогда везде где идет взаимодействие интересов и постов нужно будет использовать свою функцию + админку тоже ковырять придется..

как-то это неправильно



Офлайн

#5 Март 5, 2011 12:54:11

LestatCheb
От:
Зарегистрирован: 2009-06-09
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

ManyToMany порядок

т.е. джанга генерирует запрос
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”



Офлайн

#6 Март 5, 2011 12:57:34

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

ManyToMany порядок

Используйте промежуточную таблицу в явном виде - http://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships



Офлайн

#7 Март 5, 2011 13:58:10

LestatCheb
От:
Зарегистрирован: 2009-06-09
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

ManyToMany порядок

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() порядок не изменился.

хм, или что-то еще надо сделать?



Офлайн

#8 Март 5, 2011 14:52:34

LestatCheb
От:
Зарегистрирован: 2009-06-09
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

ManyToMany порядок

пробовал так:

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.



Офлайн

#9 Март 9, 2011 15:31:39

freemon
От:
Зарегистрирован: 2008-07-17
Сообщения: 23
Репутация: +  0  -
Профиль   Отправить e-mail  

ManyToMany порядок

Как по мне проще добавить поле для таймштампа:

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']



Офлайн

#10 Март 10, 2011 10:36:47

LestatCheb
От:
Зарегистрирован: 2009-06-09
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

ManyToMany порядок

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 их отсортировать, это не то )



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version