在 django 中查询多对多字段会产生一个空查询集

Posted

技术标签:

【中文标题】在 django 中查询多对多字段会产生一个空查询集【英文标题】:Querying many to many field in django yields an empty query set 【发布时间】:2020-10-28 14:59:27 【问题描述】:

通过链接到我的帖子的附件进行查询会产生一个空的查询集,我不完全确定为什么。 它可能很愚蠢,但通过管理员我可以查看链接到帖子的所有附件(文件)。不知道管理员是如何查询的,或者我是否查询错误

多对多领域的文档:https://docs.djangoproject.com/en/3.0/topics/db/examples/many_to_many/

通过多对多字段发布指向附件的链接

Views.py

def UploadView(request):

    if request.method == 'POST':
        post_form = PostForm(request.POST)
        upload_form = UploadForm(request.POST, request.FILES)
        files = request.FILES.getlist('upload')

        if post_form.is_valid() and upload_form.is_valid():
            post_form.instance.author = request.user
            p = post_form.save()
            for f in files:  
                upload = Attachment(upload=f) #create an attachment object for each file
                done = upload.save()  #save it
                p.files.add(done)  #add it to the post object (saved before)

            return redirect('user-dashboard')
    ...

从 UploadForm 中获取所有文件,创建一个附件对象并将其添加到帖子中

管理员图片: pic of admin

在 shell 中测试它:

>>> from uploadlogic.models import Post, Attachment
>>> p = Post.objects.all().last() 
>>> p.files
>>> p.files.all()
<QuerySet []>
>>> f = Attachment.objects.all()
>>> for i in f:
...     print(i.post_set.all())            
... 
<QuerySet []>
<QuerySet []>
<QuerySet []>
<QuerySet []>
<QuerySet []>
<QuerySet []>
<QuerySet []>

# 通过 shell 发新帖可以工作

>>> k = Post(headline="",description = "",rank =20,author=CustomUser.objects.first())        
>>> k.save()
>>> k.files.add(Attachment.objects.first())
>>> k.save()
>>> k
<Post:  - 20>
>>> k.files.all()
<QuerySet [<Attachment: 1 - attachement>]>

编辑: 尝试从我的模板中查询附件,

% for attachment in post.files.all%
    <h1> Attachment included!</h1>
    % endfor %

这里没有惊喜,唯一展示的是贝壳制造的那一个

编辑:不再尝试这样做,但我刚刚意识到我的帖子没有添加附件,而是管理员显示了您可以选择的所有附件。

【问题讨论】:

PostForm.save() 返回的函数是什么?莫非这不是你要找的 Post 对象? @physicalattraction 我发布了我的 forms.py,我可能误解了表单是如何保存在视图中的,但没有立即引起我的注意。帖子肯定会保存,附件肯定会链接到某个地方(见管理员照片)。 【参考方案1】:

在阅读了几次文档后,我意识到将在视图中保存附件的操作存储为“完成”是愚蠢的。

改为保存上传

upload.save()

然后添加上传

p.files.add(upload)

hope this helps anyway else trying to do multi file uploads that have a relationship with an object.

【讨论】:

以上是关于在 django 中查询多对多字段会产生一个空查询集的主要内容,如果未能解决你的问题,请参考以下文章

Django如何过滤多对多字段中的对象,而不是原始查询集

Django ORM:构造查询,该查询将在多对多字段的最后位置的对象中的字段上查找匹配项

Django 查询集过滤具有相同多对多字段的对象

在 Django 中为多对多字段冲突反向访问器和查询?

django - 如何查询仅描述的对象存在于多对多字段中的位置

Django查询多对多子集包含