TypeError: Direct assignment to the reverse side of a related set is prohibited
TypeError: Direct assignment to the reverse side of a related set is prohibited
我有一个 Django 模型 'Restaurant',它有一个字段 parent_rest_id,它指的是保存在同一个 table 中的父餐厅。
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: Direct assignment to the reverse side of a related set is prohibited. Use parent_id.set() instead."
我已经确定 parent_id 是 Model Restaurant(Restaunt.objects.get(id=1))
的实例
请告诉我我做错了什么或者我创建的模型有误,我是 django 的新手。
PS:我没有任何自定义的序列化程序或模型管理器,DefaultColumns 是继承自 model.Models
的父级 class
>>>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'>
我能够解决这个错误,因为我有外键引用指向该键所属的同一个 table。
所以给 'related name' 是在与模型建立后向关系。这实际上是不需要的。
在 Django 中,如果我们给出 relate_name = '+',那么 Django 将跳过反向关系的创建。因此这种方法解决了我的问题。
我有一个 Django 模型 'Restaurant',它有一个字段 parent_rest_id,它指的是保存在同一个 table 中的父餐厅。
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: Direct assignment to the reverse side of a related set is prohibited. Use parent_id.set() instead."
我已经确定 parent_id 是 Model Restaurant(Restaunt.objects.get(id=1))
的实例请告诉我我做错了什么或者我创建的模型有误,我是 django 的新手。
PS:我没有任何自定义的序列化程序或模型管理器,DefaultColumns 是继承自 model.Models
的父级 class >>>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'>
我能够解决这个错误,因为我有外键引用指向该键所属的同一个 table。 所以给 'related name' 是在与模型建立后向关系。这实际上是不需要的。 在 Django 中,如果我们给出 relate_name = '+',那么 Django 将跳过反向关系的创建。因此这种方法解决了我的问题。