【问题标题】:Implementing a following system and fetching posts of people a user follows in django实现一个关注系统并获取用户在 django 中关注的人的帖子
【发布时间】:2020-09-05 21:01:56
【问题描述】:

我正在设计一个社交媒体网站,并有一个追随者/追随者系统模型,当建立追随关系时,提要将获得用户追随者的所有帖子,我试图为我的用户制作模型类和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)

【问题讨论】:

  • 你永远不应该将外键命名为“_id”,它是一个模型关系,在底层,Django 为数据库创建了一个以“_id”结尾的字段,所以现在你有了user_id_id。模型之间的关系不是“id”而是对象关系。用户关注用户,而不是 id。
  • 我已经尝试按照您的建议编辑代码,非常感谢您纠正了这个错误,但是我仍在寻找解决问题的方法。
  • self.following=Following.objects.filter(user_id=User).values_list('followers', flat=True) 将提供用户 ID 列表。您正在尝试使用列表理解来获得它
  • 另外,我只是好奇。为什么不在 User 模型中使用 ManyToMany 字段而不是 Following 模型?
  • 是的,刚刚尝试过,它可以工作 感谢您的输入,它优化了代码。与Many to Many 关系的事情是我收到了错误,我也收到了当前用户的帖子,我想避免这种情况。加上将它分成不同的模型使代码对我来说更具可读性。

标签: python sql django django-models


【解决方案1】:

我认为问题出在这行代码self.following=Following.objects.filter(user_id=User).values('following_user_id') values('following_user_id') 返回列表或字典而不是对象,但在 GetPosts() 中,您正在过滤对象 self.post=Post.objects.filter(posted_by__in=self.following)

self.following 应该是用户对象。

解决方案

删除 values('following_user_id') 并进行更改,将 GetPosts(self) 更改为 self.post=Post.objects.filter(posted_by__in=self.following.user_id)

【讨论】:

  • 感谢您抽出宝贵的时间来回答这个问题,但不幸的是,这不起作用代码返回 Query set object has no attribute user_id。这种情况下可以使用序列化器来解析数据吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
  • 2020-05-11
相关资源
最近更新 更多