Найти - Пользователи
Полная версия: ManyToMany c промежуточной моделью и .add
Начало » Django » ManyToMany c промежуточной моделью и .add
1
maxfox
Здравствуйте!

Столкнулся с проблемой при явном указании промежуточной модели в ManyToMany.
Проблема в том, что не работает метод add. Проблема описана в документации, но суть ее мне не очень ясна. Есть ли какие-то пути обхода, например прописать свой метод add и задать кастомный ManyRelatedManager. Хотелось бы узнать у более опытных коллег, возможно ли такое и чем это чревато..
Singularity
maxfox
В чем проблема ?
Если не надо хранить никакие данные используй просто поле, а если надо еще хранить явно указываешь
модель.

Почему нет .add ?
Да потому что ты можешь просто создавать новую запись и указывать дополнительные данные, а с add это не очень удобно + не очень явно.

Если хочешь сделай в модели свой метод
def add(self, model, **kwargs):
_ThrowModel.objects.create(fk_1= self,fk_2= model, **kwrags)
maxfox
Спасибо!
Насчет метода думал, но хотелось через .add самого поля.

Вдогонку еще вопрос: как сделать так, чтобы при создании экземпляра модели, в которой есть m2m через through, поле с m2m было обязательным к заполнению?

Т.е. к примеру есть книга и автор, авторов может быть много, но должен быть хотя бы один. Сейчас мне django позволяет создать и сохранить объект с незаполненным m2m полем, хотя blank и null не указаны.
Singularity
maxfox
это в форме надо делать такое
добавить поле с required
maxfox
Спасибо за ответы, но появился еще один вопрос по m2m с кастомной промежуточной таблицей.
При использовании ModelForm я (в идеальном случае) просто делаю form.save()
Как быть, если при этом нужно еще создать m2m связь? Сделать это вручную во view?
У меня в методе create менеджера модели прописано создание записи в промежуточной таблице, но, получается, что это без толку, т.к. форма не использует метод create, а создает объект через конструктор.

Короче, как-то все через одно место получается, или я чего-то не понимаю в Django и его логике..
pythonlove
Вы можете использовать сигналы, например django.db.models.signals.post_save

from django.dispatch import receiver
from django.db.models import signals
@receiver(signals.post_save, sender=YourModel):
def your_model_post_save(sender, instance, created, **kwargs):
    # create something
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