python - 类型错误 : Direct assignment to the reverse side of a related set is prohibited

标签 python django django-models foreign-keys django-related-manager

我有一个 Django 模型“餐厅”,它有一个字段 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) 为其创建一行时。

我收到此错误“TypeError:禁止直接分配给相关集的反面。改用 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'>

最佳答案

我能够解决这个错误,因为我有指向该键所属的同一个表的外键引用。 因此,给出“相关名称”是在与模型建立后向关系。这实际上是不需要的。 在 Django 中,如果我们给 relate_name = '+',那么 Django 将跳过反向关系的创建。因此,这种方法解决了我的问题。

关于python - 类型错误 : Direct assignment to the reverse side of a related set is prohibited,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61566720/

相关文章:

django - 复制虚拟环境以进行生产

django - 使用 Django 上传图像

python - 如果我要创建联系表单,是否需要在 models.py 中执行某些操作?

python - 对查询集进行排序的好方法? - Django

python - 当输出依赖于其他元素时,以 pythonic 方式对列表进行操作

python - 如何在python中使用urllib接收用户想要检索的文件的大小

python - 获取 [@unittest.skipIf 装饰器] 条件的过时值

python - Django 缓存 - 可以抢先完成吗?

python - Django:如何替换/覆盖/更新/更改 FileField 的文件?

python - 如何阻止pydoc在f字符串上出错?