class User(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
gender = models.IntegerField()
email = models.CharField(max_length=100)
password = models.CharField(max_length=255)
following = models.ManyToManyField("self", related_name='followers')
objects = UserManager()
def __repr__(self):
return "User: {0}".format(self.name)
In my model, User, users can follow and followed by each other.
I can find who the user is following by this:
user1 = User.objects.get(id=1)
following = user1.following.all()
However, I can't figure out how to find whom the user is followed by.
I tried:
user1.followers.all()
since it is the related_name in the following field in my model.
Can anybody please teach me how to do this?
Thank you very much.
You should pass the symmetrical attribute to be False.
From the docs:
When Django processes this model, it identifies that it has a
ManyToManyFieldon itself, and as a result, it doesn’t add afollowersattribute to theUserclass. Instead, theManyToManyFieldis assumed to be symmetrical – that is, if I am yourfollower, then you are myfollower.If you do not want symmetry in many-to-many relationships with
self, setsymmetricaltoFalse. This will force Django to add the descriptor for the reverse relationship, allowingManyToManyFieldrelationships to be non-symmetrical.
In your case:
class User(models.Model):
# ...
following = models.ManyToManyField('self', related_name='followers', symmetrical=False)
# ...
Then in your views.py you can access both:
following = user.following.all()
followers = user.followers.all()
Since now the relationship with self is non-symmetrical.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With