\$\begingroup\$
\$\endgroup\$
I am writing a simple social media application in Django. I would like to know whether the following model structure is correct, or how can I improve the schema to get better performance. Do I need to split the following relation into a separate model? Like in this question
Models.py
class User(AbstractBaseUser, PermissionsMixin):
"""
Custom user model with email as username
"""
email = models.EmailField(unique=True)
first_name = models.CharField(max_length=75, blank=True, null=True)
last_name = models.CharField(max_length=75, blank=True, null=True)
date_joined = models.DateTimeField(auto_now_add=True)
date_of_birth = models.DateField(validators=[validate_dob],
blank=True, null=True)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
avatar = models.URLField(blank=True, null=True)
followers = models.ManyToManyField("self", blank=True,
symmetrical=False,
related_name='following')
objects = UserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
def __str__(self):
return self.email
@property
def age(self):
current_year = datetime.datetime.today.year
return current_year - self.date_of_birth.year
def get_full_name(self):
return '{} {}'.format(self.first_name, self.last_name)
def get_short_name(self):
return self.first_name
class Post(models.Model):
title = models.CharField(max_length=45)
description = models.CharField(max_length=144)
author = models.ForeignKey(User, on_delete=models.CASCADE)
published_on = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ['published_on']
def __str__(self):
return self.title
To prepare the feed for a requested user, I would like to use the query,
u1 = User.objects.first()
posts = Post.objects.filter(author__in=u1.following.all())
lang-py