【问题标题】:Django - queryset for multiple models that related with foreignkeyDjango - 与外键相关的多个模型的查询集
【发布时间】:2014-07-22 02:57:31
【问题描述】:

我有这样的models.py:

class Post(models.Model):
    name = models.CharField(max_length=100,blank=True)
    author = models.ForeignKey(User, null=True, blank=True)
    ...

class Categories(models.Model):
   category = models.CharField(max_length=200)
   post_id = models.ForeignKey(Post)

class Tags(models.Model):
  tag = = models.CharField(max_length=200)
  tag_id = models.ForeignKey(Post)  

如果给定作者 ID,我如何获取所有相关对象。 例如。在view.py中

def AllPost(request, userid):
    posts = Post.objects.filter(author=userid)
    for post in Posts:
         category = Categories.filter(post_id = post.id)
         tag = Tags.filter(post_id = post.id)

上述函数的问题会导致对每个帖子进行额外的查询。有没有办法在单个查询中调用所有对象??

【问题讨论】:

标签: django django-queryset


【解决方案1】:

这样怎么样:

Categories= Category.objects.filter(tag_id__author=userid) #assuming userid is an User object like for example: request.User
Tags= Tags.objects.filter(post_id__auther=userid)

如果您想在单个查询中从Post 获取类别和标签,那么您将从以下查询中获取 ValuesQuerySet:

data= Post.objects.filter(auther=userid).values_list('category', 'tags') #or .values_list('category__category', 'tags__tag') 

【讨论】:

    【解决方案2】:

    对于 django >= 1.4,使用prefecth_related

    class Post(models.Model):
        name = models.CharField(max_length=100,blank=True)
        author = models.ForeignKey(User, null=True, blank=True)
        ...
    
    class Categories()models.Model:
       category = models.CharField(max_length=200)
       post = models.ForeignKey(Post, related_name='categories')
    

     

    def get_all_posts(request, user_id):
        posts = Post.objects.filter(author=user_id).prefetch_related('categories')
        for post in posts:
             categories = post.categories
    

    (注意:修复了一些代码错误。)

    对于django,可以使用django_prefetch插件。

    【讨论】:

    • 但是标签呢?我可以 prefetch_related 多个对象吗?喜欢prefetch_related('categories', 'tags')?
    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2023-01-26
    相关资源
    最近更新 更多