#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
. Можно ли использовать сериализаторы в этой ситуации для анализа данных?