rahmatnazali
rahmatnazali

Reputation: 180

django - ValueError: <model> needs to have a value for field "id" before this many-to-many relationship can be used

Say, I have a model Post which has many to many relation to built-in User for 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')

All is going nice for the logic, I can add/remove the like relation nicely. But when I introduce additional attribute save for saved_post, like this:

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')

It always throw an error below when I'm trying to even instantiate the Post model.

ValueError: "<Post: Post object (None)>" needs to have a value for field "id" before this many-to-many relationship can be used.

Note that I did not even modify/add any custom save() method.

The error just pops up even when I'm trying to call p = Post.object.create().

From what I have known, I need to save Post first before adding any like or save relation. But I got error even from saving a Post instance.

====

Edit 1

Include a full stack trace:

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.

Upvotes: 0

Views: 1009

Answers (1)

Pedram
Pedram

Reputation: 3920

The problem here is that the save field in Post model conflicts with the internal save method and cause this error.

Simply changed the field name, like:

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')

Upvotes: 1

Related Questions