Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Некоторые тонкости использования ForeignKey и ManyToManyField в одной модели [RSS Feed]

#1 Апрель 13, 2014 08:12:25

fongostev
От: Moskau
Зарегистрирован: 2012-04-03
Сообщения: 62
Репутация: +  4  -
Профиль   Отправить e-mail  

Некоторые тонкости использования ForeignKey и ManyToManyField в одной модели

Добрый день!

Столкнулся с не слишком понятной проблемой при сохранении базы данных.
Есть модель (общая структура не важна), имеющая отношения на саму себя:

class TaskModel(models.Model):
    task_before = models.ForeignKey('self', blank=True, null=True, related_name="before")                                                                                  
    tasks_after = models.ManyToManyField('self', blank=True, null=True, related_name="after") 
Поле task_before заполняется обычным образом, сохраняется модель и заполняется поле tasks_after:
TasksAfter = TaskModel.objects.filter(task_before=Task).exclude(code=Task.code)                         
for task in TasksAfter:                                                                                 
    Task.tasks_after.add(task)
На первый взгляд все должно работать, но неожиданно в ManyToManyField оказывается помимо значений из TasksAfter еще и значение task_before. Мне непонятны причины такого поведения на первый взгляд прозрачного кода.
Никто не сталкивался с подобным?

UPD:
Task.tasks_after.remove(Task.task_before)
и прочие извращения не помогают. Точнее помогают, то в некоторых объектах удаляется не то, что нужно.

Отредактировано fongostev (Апрель 13, 2014 08:20:49)

Офлайн

#2 Апрель 13, 2014 12:31:54

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

Некоторые тонкости использования ForeignKey и ManyToManyField в одной модели

Напишите тест и все поймете.

Офлайн

#3 Апрель 13, 2014 13:08:10

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

Некоторые тонкости использования ForeignKey и ManyToManyField в одной модели

fongostev
На первый взгляд все должно работать, но неожиданно в ManyToManyField оказывается помимо значений из TasksAfter еще и значение task_before. Мне непонятны причины такого поведения на первый взгляд прозрачного кода.

TasksAfter = TaskModel.objects.filter(task_before=Task).exclude(code=Task.code) 

Вы же делаете выборку записей со всеми полями.
Для получения значений только из поля task_after, должно быть как-то так:

                  
for task in TasksAfter.task_after:                                                                                 
    Task.tasks_after.add(task)

Офлайн

#4 Апрель 13, 2014 19:10:06

fongostev
От: Moskau
Зарегистрирован: 2012-04-03
Сообщения: 62
Репутация: +  4  -
Профиль   Отправить e-mail  

Некоторые тонкости использования ForeignKey и ManyToManyField в одной модели

PanovSergey
Напишите тест и все поймете.
Тесты показывают, что что-то ломается на этапе сохранения. Т.е. foreign key сохраняется нормально, для manytomany формируются правильные наборы объектов, а после сохранения внезапно значение из foreign key оказывается в manytomany. Ничего не понимаю.
Попытки удалить task_before из tasks_after через
Task.tasks_after.remove(Task.task_before)
приводят к полной очистке последнего.

Офлайн

#5 Апрель 13, 2014 20:34:11

fongostev
От: Moskau
Зарегистрирован: 2012-04-03
Сообщения: 62
Репутация: +  4  -
Профиль   Отправить e-mail  

Некоторые тонкости использования ForeignKey и ManyToManyField в одной модели

Alen
Вы же делаете выборку записей со всеми полями.
Для получения значений только из поля task_after, должно быть как-то так:
Так мне и нужна выборка моделей с отношением к текущему объекту

Офлайн

  • Начало
  • » Django
  • » Некоторые тонкости использования ForeignKey и ManyToManyField в одной модели[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version