Django Many-to-Many (m2m) Relation to same model

Viewed 38057

I'd like to create a many-to-many relationship from and to a user class object.

I have something like this:

class MyUser(models.Model):
    ...
    blocked_users = models.ManyToManyField(MyUser, blank=True, null=True)

The question is if I can use the class reference inside itself. Or do I have to use "self" insead of "MyUser" in the ManyToManyField? Or is there another (and better) way to do it?

6 Answers

Don't forget use symmetrical=False, if you use .clear() or .add() method for related objects and don't wanna object on other side of relation update own data in relation field.

some_field = models.ManyToManyField('self', symmetrical=False)

I think it should be class name instead of self. because with using self like this

parent = models.ManyToManyField('self', null=True, blank=True)

when i add parent:

user1.parent.add(user2)

i have 2 record in database like this: enter image description here

and with using class name liken this:

parent = models.ManyToManyField('User', null=True, blank=True)

i have one record in database like this: enter image description here

note that i use uuid for pk and i use django 3.1

EDIT: as @shinra-tensei explained as comment in this answer we have to set symmetrical to False if we use self. documented in Django Documents: ManyToManyField.symmetrical

don't use 'self' in ManyToManyField, it will cause you object link each other, when use django form to submit it

class Tag(models.Model):
    ...
    subTag = models.ManyToManyField("self", blank=True)

 ...
 aTagForm.save()

and result:

 a.subTag == b
 b.subTag == a
Related