【问题标题】:FieldError djangoFieldError django
【发布时间】:2020-11-28 20:38:44
【问题描述】:

我需要帮助,我不知道问题出在哪里,请看下面的代码

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def post_feed_view(request, *args, **kwargs):
    user = request.user
    profiles = user.follow_user.all()
    followed_users_id = []
    if profiles.exists():
        followed_users_id = [x.user.id for x in profiles]
    followed_users_id.append(user.id)
    queryset = Post.objects.filter(user__id__in=followed_users_id).order_by("-date_posted")
    serializer = PostSerializer(queryset, many=True)
    return Response(serializer.data, status=200)

我不断收到此错误:无法将关键字“用户”解析为字段。选项有:作者、author_id、 虽然,在我的模型中,我没有“用户”,我拥有的是“作者”。 但我不知道究竟该把作者放在哪里。我认为我的问题是我不完全理解“request.user”。

请帮忙!

============

这是 Profile 和 Follow 模型:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    bio = models.CharField(max_length=245, null=True)
    image = models.ImageField(default='default.png', upload_to='profile_pics')
    interests = models.ManyToManyField(Category, related_name='interests_user')
    stripe_customer_id = models.CharField(max_length=50, blank=True, null=True)
    one_click_purchasing = models.BooleanField(default=False)

    is_vendor = models.BooleanField(default=False)
    # vendor
    bvn = models.CharField(max_length=10, null=True, blank=True)
    description = models.TextField(null=True, blank=True)
    address = models.CharField(max_length=200, null=True, blank=True)
    company = models.CharField(max_length=100, null=True, blank=True)
    # follow_user = models.ManyToManyField('users.Follow') 
    

    def __str__(self):
        return f'{self.user.username} Profile'

    @property
    def followers(self):
        return Follow.objects.filter(follow_user=self.user).count()

    @property
    def following(self):
        return Follow.objects.filter(user=self.user).count()

    def save(self, force_insert=False, force_update=False, using=None,
             update_fields=None):
        super().save()

        img = Image.open(self.image.path)
        if img.height > 300 or img.width > 300:
            output_size = (300, 300)
            img.thumbnail(output_size)
            img.save(self.image.path)


class Follow(models.Model):
    user = models.ForeignKey(User, related_name='user', on_delete=models.CASCADE)
    follow_user = models.ForeignKey(User, related_name='follow_user', on_delete=models.CASCADE)
    date = models.DateTimeField(auto_now_add=True)
    old_instance = models.ForeignKey('Follow', blank=True, null=True, on_delete=models.CASCADE, editable=False)

    def save(self, *args, **kwargs):
        if self.pk is not None:
            self.old_instance = Follow.objects.get(pk=self.pk)
        super().save(*args,**kwargs)

    def __str__(self):
        return f"For: {self.user} // id: {self.id}"
    
class FollowerRelation(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    profile = models.ForeignKey("Profile", on_delete=models.CASCADE)
    timestamp = models.DateTimeField(auto_now_add=True)

【问题讨论】:

  • 你能分享Profile和Follow的模型吗?

标签: python django django-models django-views


【解决方案1】:

您的Post 模型显然没有user 字段,但有一个author 字段,因此您可以使用以下内容进行过滤:

queryset = Post.objects.filter(
    author_id__in=followed_users_id
).order_by('-date_posted')

但话虽如此,您不应该那样过滤。给定您的模型,您可以在单个查询中执行此操作,从而避免 N+1 问题。您可以简单地过滤:

@api_view(['GET'])
@permission_classes([IsAuthenticated])
def post_feed_view(request, *args, **kwargs):
    queryset = Post.objects.filter(
        author__follow_user__user=request.user
    ).order_by('-date_posted')
    serializer = PostSerializer(queryset, many=True)
    return Response(serializer.data, status=200)

【讨论】:

  • 是的。我明白你在说什么,我只是这样做是为了在使用模型更新它之前进行检查。太感谢了。
猜你喜欢
  • 1970-01-01
  • 2015-07-18
  • 2014-01-03
  • 2020-08-21
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
相关资源
最近更新 更多