【问题标题】:filtering a queryset based on the results of anoter one根据另一个查询集的结果过滤查询集
【发布时间】:2020-03-12 23:36:14
【问题描述】:

所以我有一个名为 post 的模型,它的一个字段是用户模型的外键,我有另一个名为订阅的模型,它有 2 个外键,一个指向用户,另一个指向另一个帐户,我想要过滤帖子查询集以仅显示来自有订阅对象的人的帖子,其中用户订阅了帖子的创建者。我的模型如下所示:

class post(models.Model):
    creator = models.ForeignKey(Account,blank=False,null=False,on_delete=models.CASCADE)
    ...

class subscriptions(models.Model):
    subscriber = models.ForeignKey(Account,blank=False,null=False,on_delete = models.CASCADE, related_name='subscriber')
    subscribed_to = models.ForeignKey(Account,blank=False,null=False,on_delete = models.CASCADE, related_name='subscribed_to')

我尝试在视图中这样做

posts = post.objects.filter(creator__in = request.user.subscribed_to)

但它什么也没返回

这是我的帐户模型:

class Account(AbstractBaseUser):
    email = models.EmailField(verbose_name='email', max_length=60, unique=True)
    username = models.CharField(max_length=30, unique=True)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    addresse = models.CharField(max_length=60)
    city = models.CharField(max_length=50)
    party_count = models.IntegerField(default=0)
    verified = models.BooleanField(default=False)
    profil_pic = models.ImageField(upload_to='profil_pics/',blank=True)
    birthday = models.DateField(default=date.today())
    date_joined = models.DateTimeField(verbose_name='date_joined', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last_login', auto_now=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email','first_name','last_name','addresse','birthday','city']

    objects = MyAccountManager()

    def __str__(self):
        return self.username

    def has_perm(self, perm, obj=None):
        return self.is_admin

    def has_module_perms(self,app_label):
        return True

【问题讨论】:

  • 欢迎来到SO,能否提供Account模型的代码?
  • @EliakinCosta 谢谢,我编辑了它以包含帐户模型
  • 它的关系检查似乎更像这样 [ post.creator = subscriptions.subscribed_to AND subscriptions.subscriber = request.user ]。对不起,我不习惯 django 的实现细节。

标签: python django django-queryset


【解决方案1】:

您可以在一个查询中解决它。

Post.objects.filter(creator__subscribed_to__subscriber=request.user)

【讨论】:

    【解决方案2】:

    在做了一些研究后,我最终找到了一些导致:

    subs = subscriptions.objects.filter(subscriber=request.user).values_list('subscribed_to')
    posts = post.objects.filter(creator__in = subs
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 2015-05-10
      • 2021-03-01
      • 1970-01-01
      • 2017-07-09
      • 2013-04-20
      • 2018-07-07
      相关资源
      最近更新 更多