Django ORM - 检索数据时出错 -

Posted

技术标签:

【中文标题】Django ORM - 检索数据时出错 -【英文标题】:Django ORM - Error retreiving data - 【发布时间】:2017-01-07 15:00:30 【问题描述】:

我正在创建一个页面,其中包含一个视频,多个 cmets,每个评论的回复 我可以检索视频和 cmets,但最终没有检索到每个评论的回复。 我在视图文件中做了一些 for 循环,但也不知道如何在模板文件中检索它。 到目前为止,我一直在视图和模板之间徘徊

我正在使用 django 1.10.4

models.py

class Video(models.Model):
    title = models.CharField(max_length=120)
    embed_code = models.CharField(max_length=500)
    slug = models.SlugField(null=True, blank=True)
    category = models.ForeignKey("Category", null=True)
    timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    active = models.BooleanField(default=True)
    featured = models.BooleanField(default=False)
    free_preview = models.BooleanField(default=False)
    share_message = models.CharField(max_length=150, default=default_share_message)

    objects = models.Manager()
    # activemodel = ActiveModel()
    featuresandactive = Features()
    class Meta:
        unique_together = ('slug', 'category')
    def __str__(self):
        return self.title

    def get_absolute_url(self):
        try:
            return reverse('video_detail', kwargs='vid_slug':self.slug, 'cat_slug':self.category.slug)
        except:
            return "/"


class Comment(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.ForeignKey(MyUser)
    path = models.CharField(max_length=350)
    video = models.ForeignKey(Video, null=True, blank=True)
    text = models.TextField()
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    Timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
    active = models.BooleanField(default=True)


    objects = CommentManager()
    def __str__(self):
        return self.text


class Reply(models.Model):
    user = models.ForeignKey(MyUser)
    comment = models.ForeignKey(Comment,null=True, blank=True)
    text = models.TextField()
    updated = models.DateTimeField(auto_now=True, auto_now_add=False)
    Timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
    active = models.BooleanField(default=True)


    objects = ReplyManager()
    def __str__(self):
        return self.text

views.py

def video_detail(request, cat_slug, vid_slug):

    cat = Category.objects.get(slug=cat_slug)
    comments = Comment.objects.filter(video=obj)
    replys = Reply.objects.filter(comment=comments)

    context = 

    "cat": cat,
    "obj":obj,
    "comments":comments,
    "replys":replys,

    
    return render(request, 'video_detail.html', context)

这是另一个视图.py 我也试过了,但没有用

def video_detail(request, cat_slug, vid_slug):

    cat = Category.objects.get(slug=cat_slug)

    obj = Video.objects.get(slug=vid_slug)

    comments = obj.comment_set.all()

    Replies = Reply.objects.filter(comment_id=comments.id))

    context = 

    "cat": cat,
    "obj":obj,
    "comments":comments,
    "replies":replies
    
    return render(request, 'video_detail.html', context)

【问题讨论】:

您面临的问题是什么?预期的行为是什么,如果您遇到任何错误等,是什么? 'QuerySet' 对象没有属性 'id'...这是第一个问题。如果我在视图中使用 for 循环,它可以解决。但是我怎么能在模板文件中获取这些数据。我主要是尝试制作一个简单的页面,例如 youtube 视频页面。 1 个视频 ..许多 cmets。每条评论都有很多回复 【参考方案1】:

IMO,您可以在模板中表示 cmets。您的模板可能如下所示。

# your_template.html
% for comment in obj.comment_set.all %
    comment.user: comment.text
    % for reply in comment.reply_set.all %
        reply.user: reply.text
    % endfor %
% endfor %

那么您的视图函数只需要catobj,而不需要commentsreplies。另请查看select_related

【讨论】:

不幸的是,它实际上并没有工作。它无法解析任何数据。

以上是关于Django ORM - 检索数据时出错 -的主要内容,如果未能解决你的问题,请参考以下文章

ORM Django 多对多

使用 Django ORM 进行选择性事务管理

在 Django 中检索多个选择选项时出错

Django ORM。检索每个类别的10个项目

Django ORM:在不执行 N+1 查询的情况下检索帖子和最新评论

Django—— ORM查询(sql优化)优化了解,Django(元信息)元类建索引