Ошибка типа: прямое назначение обратной стороне связанного набора запрещено - PullRequest
0 голосов
/ 03 мая 2020

У меня есть Django модель 'Restaurant' с полем parent_rest_id, который ссылается на один родительский ресторан, сохраненный в той же таблице.

class Restaurant(DefaultColumns):
   name = models.CharField(null=False, max_length=40)
   restaurant_code = models.CharField(null=False, max_length=40, default='')
   parent_rest_id = models.ForeignKey(
                       'self',
                       null=False, 
                       db_column='parent_id',
                       default=0, 
                       related_name='parent_id',
                       on_delete=models.CASCADE
                    )
   restaurant_type = models.ForeignKey(
                       RestaurantType,
                       null=False, default='10', 
                       db_column='restaurant_type',
                       related_name='restaurant_type', 
                       on_delete=models.DO_NOTHING
                    )

Теперь, когда я пытаюсь создать строку для него с помощью Model.objects.create (** dict).

Я получаю эту ошибку "Ошибка типа: прямое назначение обратной стороне связанного набора запрещено. Вместо этого используйте parent_id.set ()."

Я убедился, что parent_id является экземпляром Model Restaurant (Restaunt.objects.get (id = 1))

Пожалуйста, дайте мне знать, что я делаю неправильно или я создал моя модель неверна, я новичок в django.

PS: у меня нет настроенного сериализатора или менеджера моделей, а DefaultColumns является родительским классом, который наследует от model.Models

 >>>Model.objects.create(**filtered_dict)
Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm Community Edition 2020.1\plugins\python-ce\helpers\pydev\_pydevd_bundle\pydevd_exec2.py", line 3, in Exec
    exec(exp, global_vars, local_vars)
  File "<input>", line 1, in <module>
  File "C:\Users\Nerd\Documents\myvirtualenv\lib\site-packages\django\db\models\base.py", line 495, in __init__
    _setattr(self, prop, kwargs[prop])
  File "C:\Users\Nerd\Documents\myvirtualenv\lib\site-packages\django\db\models\fields\related_descriptors.py", line 546, in __set__
    % self._get_set_deprecation_msg_params(),
TypeError: Direct assignment to the reverse side of a related set is prohibited. Use parent_id.set() instead.

>>> filtered_dict
{'name': 'A2b', 'email': '', 'parent_id': <Restaurant: Default, >, 'restaurant_type': <RestaurantType: Store>, 'phone': '', 'address': '', 'city': '', 'postal_code': '', 'restaurant_code': 'A2B'}


>>>Model
<class 'Restaurant'>

1 Ответ

0 голосов
/ 06 мая 2020

Мне удалось устранить эту ошибку, поскольку у меня есть ссылка внешнего ключа на ту же таблицу, к которой принадлежит ключ. Таким образом, присвоение «связанного имени» создавало обратную связь с моделью. Который был на самом деле не нужен. В Django, если мы дадим relate_name = '+', тогда Django пропустит создание обратной связи. Следовательно, этот подход решил мою проблему.

...