Реализация следующей системы и выборка сообщений о людях, на которых подписывается пользователь, в django

#python #sql #django #django-models

#python #sql #django #django-модели

Вопрос:

Я разрабатываю сайт социальных сетей и у меня есть модель системы подписчиков / подписчиков, которая при установлении следующих отношений будет получать все сообщения от подписчиков пользователя, я попытался создать модель для моего класса user и класса post следующим образом:

 class User(AbstractBaseUser):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    username = models.CharField(max_length=30, unique=True)
    password = models.CharField(max_length=30)
    email = models.EmailField(max_length=30, unique=True)
    contact_no = models.CharField(max_length=15)
    is_admin = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)

class Post(models.Model):
    posted_by=models.ForeignKey(User,on_delete=models.CASCADE)
    date= models.DateField(auto_now=True)
    time=models.TimeField(auto_now=True)
    content=models.CharField(max_length=2000)
    media=models.ImageField(blank=True)
  

и это модель, которая устанавливает отношения между двумя пользователями.

 class Following(models.Model):
    user_id = models.ForeignKey(User, related_name="following", on_delete=models.CASCADE)
    following_user_id= models.ForeignKey(User,related_name='followers',on_delete=models.CASCADE)

    class Meta:
        unique_together = ("user_id", "following_user_id") 
  

Но когда я пытаюсь объединить вещи, вызывая сообщения соответствующего пользователя с помощью этого кода

 class Feed():
    def __init__(self,User):
        self.following=Following.objects.filter(user_id=User).values('following_user_id')

    def GetPosts(self):
        self.post=Post.objects.filter(posted_by__in=self.following) 
  

Но это возвращает мне пустой список даже после создания объектов, если кто-нибудь из вас, ребята, мог бы помочь мне с этим в любом случае, я был бы очень признателен.

Редактировать

Проблема была решена, набор запросов необходимо было проанализировать, чтобы получить пользовательские объекты и исправить соглашение об именовании в полях модели, как предложил @Melvyn

Модели

 class Following(models.Model):
    user = models.ForeignKey(User, related_name="following", on_delete=models.CASCADE)
    following_user= models.ForeignKey(User,related_name='followers',on_delete=models.CASCADE)

    class Meta:
        unique_together = ("user_id", "following_user_id") 

  

Временная шкала

Файл, который получает сообщение от следующих пользователей.

 class Feed():
    def __init__(self,user):
        temp=Following.objects.filter(user=user)
        self.following =[temp[i].following_user for i in range(len(temp))]
    def GetPosts(self):
        self.post=Post.objects.filter(posted_by__in=self.following)
  

Комментарии:

1. Вы никогда не должны называть внешний ключ «_id», это отношение модели, и под капотом Django создает поле, которое заканчивается на «_id» для базы данных, так что теперь у вас есть user_id_id . Отношения между моделями — это не «идентификаторы», а объектные отношения. Пользователь следует за пользователем, а не за идентификатором.

2. Я попробовал это, отредактировал код, как вы предложили, я действительно ценю, что вы исправили эту ошибку, однако я все еще нахожусь в поиске решения моей проблемы.

3. self.following=Following.objects.filter(user_id=User).values_list('followers', flat=True) выдаст список идентификаторов пользователей. которые вы пытаетесь получить, используя понимание списка

4. Кроме того, мне просто любопытно. Почему бы вместо ManyToMany поля в User модели не использовать Following модель?

5. Да, только что попробовал это, и это работает, спасибо за ввод, он оптимизировал код. Проблема с Many to Many отношениями заключалась в том, что я получал ошибки, связанные с сообщениями текущего пользователя, которых я хочу избежать. плюс разделение этого на другую модель сделало код более читаемым для меня.

Ответ №1:

Я думаю, что проблема в этой строке кода self.following=Following.objects.filter(user_id=User).values('following_user_id') значения (‘following_user_id’) возвращают список или dict, а не объект, но в getPosts() вы фильтруете по объекту self.post=Post.objects.filter(posted_by__in=self.following)

self.following должен быть объектом пользователя.

решение

удалите значения (‘following_user_id’) и внесите изменения в измените getPosts (self) на self.post=Post.objects.filter(отправлено_by__in=self.following.user_id)

Комментарии:

1. Спасибо, что нашли время ответить на этот вопрос, но, к сожалению, это не работает, код возвращает это Query set object has no attribute user_id . Можно ли использовать сериализаторы в этой ситуации для анализа данных?