Найти - Пользователи
Полная версия: Некоторые тонкости использования ForeignKey и ManyToManyField в одной модели
Начало » Django » Некоторые тонкости использования ForeignKey и ManyToManyField в одной модели
1
fongostev
Добрый день!

Столкнулся с не слишком понятной проблемой при сохранении базы данных.
Есть модель (общая структура не важна), имеющая отношения на саму себя:
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)
и прочие извращения не помогают. Точнее помогают, то в некоторых объектах удаляется не то, что нужно.
PanovSergey
Напишите тест и все поймете.
Alen
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)
fongostev
PanovSergey
Напишите тест и все поймете.
Тесты показывают, что что-то ломается на этапе сохранения. Т.е. foreign key сохраняется нормально, для manytomany формируются правильные наборы объектов, а после сохранения внезапно значение из foreign key оказывается в manytomany. Ничего не понимаю.
Попытки удалить task_before из tasks_after через
Task.tasks_after.remove(Task.task_before)
приводят к полной очистке последнего.
fongostev
Alen
Вы же делаете выборку записей со всеми полями.
Для получения значений только из поля task_after, должно быть как-то так:
Так мне и нужна выборка моделей с отношением к текущему объекту
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