【问题标题】:django - ValueError: <model> needs to have a value for field "id" before this many-to-many relationship can be useddjango - ValueError: <model> 需要有一个字段“id”的值才能使用这种多对多关系
【发布时间】:2019-12-16 02:54:16
【问题描述】:

比如说,我有一个模型 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')

逻辑上一切都很顺利,我可以很好地添加/删除类似的关系。 但是当我为saved_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')
    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(),错误也会弹出。

据我所知,在添加任何 likesave 关系之前,我需要先保存 Post。但即使保存 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.

【问题讨论】:

  • 你成功运行make migrationsmigrate了吗?还包括 full 回溯消息。
  • @PedramParsian 是的,我做了makemigrationsmigrate 没有问题。
  • 我认为 (几乎可以肯定) 错误是因为您的 save 字段与一些内部工作流程冲突;尝试将其重命名为 saved_posts 之类的名称,看看是否能解决问题。
  • @PedramParsian 非常感谢您的帮助!我不会猜到的!

标签: django django-models


【解决方案1】:

这里的问题是Post模型中的save字段与内部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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    相关资源
    最近更新 更多