django - django - 值错误:在可以使用这种多对多关系之前,需要为字段“id”设置一个值
问题描述
说,我有一个模型与内置的Post
多对多关系User
liked_post
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
like = models.ManyToManyField(User, related_name='liked_posts')
逻辑上一切都很好,我可以很好地添加/删除类似的关系。但是当我为 引入附加属性save
时saved_post
,如下所示:
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
like = models.ManyToManyField(User, related_name='liked_posts')
save = models.ManyToManyField(User, related_name='saved_posts')
当我尝试实例化Post
模型时,它总是在下面抛出错误。
ValueError: "<Post: Post object (None)>" needs to have a value for field "id" before this many-to-many relationship can be used.
请注意,我什至没有修改/添加任何自定义save()
方法。
即使我尝试调用该错误也会弹出p = Post.object.create()
。
据我所知,Post
在添加任何like
或save
关系之前,我需要先保存。但即使保存 Post 实例,我也遇到了错误。
====
编辑 1
包括完整的堆栈跟踪:
Error
Traceback (most recent call last):
File "/home/rahmat/Upworks/06_Made_Gatewee/gatewee/app_post/tests/test_post_save.py", line 34, in setUp
p = Post.objects.create()
File "/home/rahmat/Upworks/06_Made_Gatewee/gatewee/venv/lib/python3.6/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/rahmat/Upworks/06_Made_Gatewee/gatewee/venv/lib/python3.6/site-packages/django/db/models/query.py", line 422, in create
obj.save(force_insert=True, using=self.db)
File "/home/rahmat/Upworks/06_Made_Gatewee/gatewee/venv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py", line 527, in __get__
return self.related_manager_cls(instance)
File "/home/rahmat/Upworks/06_Made_Gatewee/gatewee/venv/lib/python3.6/site-packages/django/db/models/fields/related_descriptors.py", line 840, in __init__
(instance, self.pk_field_names[self.source_field_name]))
ValueError: "<Post: Post object (None)>" needs to have a value for field "id" before this many-to-many relationship can be used.
解决方案
这里的问题是模型中的save
字段与内部方法冲突并导致此错误。Post
save
只需更改字段名称,例如:
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='posts')
like = models.ManyToManyField(User, related_name='liked_posts')
saved_posts = models.ManyToManyField(User, related_name='saved_posts')
推荐阅读
- python-3.x - 如何将 GUI 脚本 (gui.py) 集成或调用到源脚本 (main.py)?
- python-3.x - 在 numpy 中重写循环以加快执行速度
- php - 在新版本的 laravel7 上安装 vue
- python - 我如何编码这个python输入条件?
- ruby-on-rails - 为 Ruby 应用程序的 api/v1 中的 POST 请求更新 Array[JSON]
- c# - 如果第二行 Cost = 0,则需要将第二行值添加到第一行
- teamcity - 如何在 TeamCity 构建链中的多个构建中重复使用设置?
- c - 我应该安装哪些 MinGW 软件包?
- angular - 管理 AngularFire 可观察对象的订阅
- python - GCP DLP(数据丢失预防)得到“解密失败:密文无效。”-400错误