#django #django-models #django-views
#django #django-модели #django-представления
Вопрос:
Вот упрощенная версия моего класса модели:
class BlogPost(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
content = models.TextField(blank=True, null=True)
timestamp = models.DateTimeField(auto_now_add=True)
class UserProfile(models.Model):
user = models.OneToOneField(User, related_name = 'profile')
first_name = models.CharField(max_length=120, blank=True, null=True)
last_name = models.CharField(max_length=120, blank=True, null=True)
following = models.ManyToManyField(User, related_name = 'followed_by', blank=True, through='FollowingRelation')
class FollowingRelation(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
userprofile = models.ForeignKey(UserProfile, on_delete=models.CASCADE)
timestamp = models.DateTimeField(auto_now_add=True)
Я хотел бы запросить все строки из BlogPost, которые были созданы пользователем сеанса, плюс все другие записи, созданные пользователями, за которыми следит пользователь сеанса, но имеют временную метку, большую или равную отметке времени, когда пользователь сеанса начал следовать.
Я могу получать сообщения, созданные пользователем сеанса, и сообщения пользователей, за которыми следит пользователь сеанса:
profiles_exist = user.followed_by.exists
followed_users_id =[]
if profiles_exist:
followed_users_id = user.profile.following.values_list("profile__user_id",flat=True)
return self.filter(
Q(user=user) |
Q(user__id__in=followed_users_id)
).distinct().order_by("-timestamp")
Но я не могу дополнительно фильтровать сообщения следующих пользователей по временной метке с момента, когда они начали отслеживаться.
Ответ №1:
Я бы попробовал запрос без использования отношения ManyToManyThrough, возможно, подходил бы к нему больше как к обратному отношению внешнего ключа.
user.profile.followingrelation_set
.filter(Q(user__id__in=followed_users_id))
.filter(timestamp__gt=THE_TIME_VAR).distinct().order_by("-timestamp")