Почему мы не можем использовать обратную сторону отношения ForeignKey в форме Django? - PullRequest
0 голосов
/ 02 мая 2020

Я сталкиваюсь с проблемой при использовании ModelForm, и я хочу знать, схожу ли я с ума или нет, прежде чем я go отключусь, чтобы сделать несколько сложных обходных путей

Использование Случай :

У меня есть следующие определения модели:

class Setting(models.Model):
    """Manufacturing settings - can be shared among materials to be manufactured"""
    ...

class Material(models.Model):
    """Specific record for a material that is manufactured"""
    ...
    setting = models.ForeignKey('Setting', on_delete=models.SET_NULL, related_name='materials')

class ManufacturingRun(models.Model):
    """An instance of a manufacturing run"""
    material = models.ForeignKey('Material', on_delete=models.SET_NULL, related_name='manufacturing_runs')

В этом приложении данные в модели материала поступают из внешнего источника, и мы не предоставляем пользователям Возможность редактировать эти записи. Однако поле setting_id является , а не , которое заполняется как часть данных, полученных из этого внешнего источника.

В основном мне нужно, чтобы мои пользователи определяли экземпляры Setting и могли назначать каждую запись нескольким экземплярам материала. Для этого я определяю форму Setting следующим образом:

class SettingForm(forms.ModelForm):
    class Meta:
      model = Setting
      fields = [
        ...
        'materials'
      ]

Проблема: Все выглядит нормально, пока я не получаю доступ к View для создания нового Setting, тем самым вызывая создание объекта SettingForm. Сервер возвращает

django.core.exceptions.FieldError: Unknown field(s) (materials) specified for Setting

Я настолько привык к гибкости ORM Django, что я несколько сбит с толку. Я думаю, я не понимаю, почему это не может быть обработано так же, как отношения M2M в формах. Несмотря на то, что поле _id не существует ни в одной из моделей по обе стороны от поля M2M, мы можем просто использовать связанные имена при определении форм.

Я иногда создавал очень сложные обходные пути, прежде чем находил в ORM несколько смехотворно простых методов для достижения аналогичных результатов, поэтому я хотел обратиться к ним, прежде чем приступить к кодированию какого-то хрупкого и сложного беспорядка, к которому я буду бояться прикасаться. 6 месяцев.

...