Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Following users like twitter in Django, how would you do it?

I am playing with relationships in Django/python and I am wondering how you guys would create a relationship between a User and his followers and a Follower to the users he follows.

Would love to read your opinion...

like image 294
Tony Avatar asked May 15 '12 13:05

Tony


People also ask

How do I create a user in Django?

in your view, you are creating a new variable called usuario to save the request. user probably... but if you returning to the Template a context_instance , passing the value of the Context of the request, you will get the logged user, just by accessing the request .

Can Django make mobile apps?

The short answer is yes! But how? Django is a versatile python web framework with a large community and available packages. One of these popular packages is the Django Rest Framework, which can be used together with React Native to create mobile applications that work on both IOS and Android devices.


3 Answers

First, you should understand how to store additional information about users. It requires another model that has a relation to one user, the "profile" model.

Then, you could use an M2M field, assuming you'd use django-annoying, you could define your user profile model as such:

from django.db import models

from annoying.fields import AutoOneToOneField

class UserProfile(models.Model):
    user = AutoOneToOneField('auth.user')
    follows = models.ManyToManyField('UserProfile', related_name='followed_by')

    def __unicode__(self):
        return self.user.username

And use it as such:

In [1]: tim, c = User.objects.get_or_create(username='tim')

In [2]: chris, c = User.objects.get_or_create(username='chris')

In [3]: tim.userprofile.follows.add(chris.userprofile) # chris follows tim

In [4]: tim.userprofile.follows.all() # list of userprofiles of users that tim follows
Out[4]: [<UserProfile: chris>]

In [5]: chris.userprofile.followed_by.all() # list of userprofiles of users that follow chris
Out[5]: [<UserProfile: tim>]

Also, note that you could check / reuse apps like django-subscription, django-actstream, django-social (harder to use probably)...

You might want to take a look at the django packages for notifications and activities as they all require some follow/subscription database design.

like image 105
jpic Avatar answered Oct 24 '22 03:10

jpic


This is how I would do it:

class Tweeter(models.Model):  
    user = models.ManyToManyField('self', symmetrical=False, through='Relationship')

class Relationship(models.Model):  
    who = models.ForeignKey(Tweeter, related_name="who")
    whom = models.ForeignKey(Tweeter, related_name="whom")

In the shell,

In [1]: t = Tweeter()

In [2]: t.save()

In [3]: f = Tweeter()

In [4]: f.save()

In [5]: r=Relationship()

In [6]: r.who=t

In [7]: r.whom=f

In [8]: r.save()

In [18]: Relationship.objects.all()[0].who.id
Out[18]: 1L

In [19]: Relationship.objects.all()[0].whom.id
Out[19]: 2L

like image 4
zubinmehta Avatar answered Oct 24 '22 04:10

zubinmehta


Edit: Makes more sense to use ManyToManyField, as the commenter suggests. Users can have 0-x User followers, and Users can follow 0-x Users.

https://docs.djangoproject.com/en/1.3/ref/models/fields/#manytomanyfield

Without going into code, not much more to be said.

like image 1
patrickn Avatar answered Oct 24 '22 03:10

patrickn