首页 > 解决方案 > 在视图中使用两个不同的模型返回一个新创建的列表,尚未称为 Querylist,带有 For 循环

问题描述

我正在尝试创建以下视图:

class FeedAPI(ObjectMultipleModelAPIView):

    #lookup_url_kwarg = 'id'
    def get_querylist(self, *args, **kwargs):
        id = self.kwargs['id']
        props = Profile.objects.filter(id=id)
        followers = Profile.filter(followers.includes(props))

        querylist = [
            {'queryset': Profile.objects.filter(followers), 'serializer_class': ProfileSerializer},
            {'queryset': Post.objects.all(), 'serializer_class': PostSerializer},
        ]
        feedPosts= []
        for x in followers:
            feedPosts = Posts.objects.filter(Source_id=Post.sourceID)
        return Response(props, feedPosts, status=status.HTTP_200_OK)

但是我得到了type object 'Profile' has no attribute 'filter'根据堆栈溢出的错误,因为我没有在我的 def get_query 列表中返回查询列表。所以,我想知道如何才能返回具有与个人资料的关注者相关联的相同 sourceID 的 Post ID。我的模型是 Source、Profile 和 Post。Profile 和 Post 具有 sourceID ForeignKeys。

轮廓模型

class Profile(models.Model):
    user = AutoOneToOneField(User, default=True,  on_delete=models.CASCADE)
    sourceID = models.ForeignKey('Source', on_delete=models.CASCADE, related_name='+', blank=True, null=True)
    followers = models.ForeignKey( 'Source', on_delete=models.CASCADE, related_name='+', default='', blank=True, null=True)
    following = models.ForeignKey('Source', on_delete=models.CASCADE, related_name='+', default='', blank=True, null=True)

后模型

class Post(models.Model):
    sourceID = models.ForeignKey('Source', blank=True, on_delete=models.CASCADE, related_name='+', null=True)
    image = models.ImageField(
        "Post Picture", upload_to='post_pics', blank=True, null=True)
    title = models.CharField(max_length=50)

源模型

class Source(models.Model):
    profile = models.ForeignKey('Profile', on_delete=models.CASCADE, null=True, blank=True, related_name='+')

    def __str__(self):
        return str(self.id)

更新 仍然没有成功,仍然是同样的错误。但是,我尝试在 for 语句中将 feedPosts 设为一个列表:feedPosts = list(Posts.objects.filter(Source_id=Post.sourceID))然后返回 feedPosts,但我没有成功。

更新 #2 我接受了 Michal 的建议并将我的追随者更改为followers = [f.pk for f in Profile.objects.filter(followers__includes=props)]但我现在收到错误消息:'Cannot use QuerySet for "Profile": Use a QuerySet for "Source"。ValueError: Cannot use Queryset for "": Use a Queryset for ""但我看不出解决方案是如何翻译的。我的查询列表的目的只是引入多个模型。如果有人对此有解决方案,或者有更好的建议来实现我的目标,请教我。

标签: pythondjangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


Profile确实没有filter方法,除非您自己定义它。你真正需要的是objects经理。之后,您可以对数据做任何您想做的事情。

根据文档,您需要从get_querylist方法中返回字典列表,而不是 HttpResponse。那将是你的querylist变量。

要整理filter事物并获取 ID 列表,请尝试以下操作:

followers = [f.pk for f in Profile.objects.filter(followers__includes=props)]

最后一件事。您的followers字段是 a ForeignKey,它指向另一件事。ManyToManyField为此使用 a 。


推荐阅读