【问题标题】:Need help to fetch required data from model in django需要帮助从 django 中的模型中获取所需数据
【发布时间】:2017-10-25 10:20:33
【问题描述】:

我有以下两种型号,

class user_files(models.Model):
    Filename = models.CharField(max_length=50)
    Browse = models.FileField(upload_to='img/')
    user_uploaded = models.CharField(max_length=50, blank=True)

class share_files(models.Model):
    select_file = models.CharField(max_length=300)
    from_user = models.CharField(max_length=50)
    select_user = models.CharField(max_length=50,default=None)

user_files 存储各个用户上传的文件。 和 share_files 存储共享文件名 yo user xx by user bb。

我想在模板中显示与登录用户共享的文件,

我在 view.py 中的功能是,

def user_files_all(request):

    if not request.user.is_authenticated:
        return render(request, 'accounts/logout.html')
    else:
            data = user_files.objects.filter(user_uploaded=request.user)
            data1 = share_files.objects.filter(select_user=request.user)
            data2 = user_files.objects.filter(Filename=data1.select_file,user_uploaded=data1.from_user)
            args = {'data': data,'data1':data1}
            return render(request, 'accounts/files.html', args)

但我收到线路错误, data2 = user_files.objects.filter(Filename=data1.select_file,user_uploaded=data1.from_user)

因为 data1 不存在属性 select_file。我想要来自 user_files 模型的所有用户和在 data1 中选择的文件名的数据。然后想在模板中渲染它。

如何做到这一点?需要帮助。

提前致谢。

【问题讨论】:

  • 这是因为 .filter() 返回一个对象列表。您的 data1 是一个对象列表,因此您不能使用 data1.select_file。使用类似 data1[0].select_file.

标签: django django-models django-forms django-templates django-views


【解决方案1】:

filter(...) 是一个模型管理器方法,它返回一个查询集而不是一个对象。所以你可以这样做:

使用过滤器后使用first()last() 方法。因为这些方法从查询集中返回一个对象:

    data_list = user_files.objects.filter(user_uploaded=request.user)
    data1_list = share_files.objects.filter(select_user=request.user)
    if data_list.exists():
         data= data_list.first()
    else:
         data = None

    if data1_list.exists():
        data1 = data1_list.first()
        data2 = user_files.objects.filter(Filename=data1.select_file,user_uploaded=data1.from_user) # its a queryset btw
    else:
        data1 = None
        data2 = None # or user_files.objects.none()

【讨论】:

  • 这可能会出错,因为根据模型,特定用户可能有多个 user_files 实例。因此,遵循.get() 方法可能会引发 more than one object found 错误。
  • 从 user_files 模型中,user_uploaded 与 Django User 模型没有任何关系,顺便说一句,这对我来说似乎不正确。因此,此解决方案将不起作用,因为 request.user(它是一个对象)在再次使用 user_uploaded(一个字符串)时会引发错误。
【解决方案2】:

.filter() 返回一个对象列表。所以你的 data1 变量是一个列表。您不能只获取任何属性的值。

要实现您想要的,您可以尝试以下方法 -

data2 = []
for d in data1:
   ufs = user_files.objects.filter(Filename=d.select_file,user_uploaded=d.from_user)
   for uf in ufs:
       include = True
       for d2 in data2:
            if d2.pk == uf.pk:
                 include = False
                 break
       if include:
            data2.append(uf)

附带说明 - 您的模型设计看起来不太好。考虑使用外键。更多请参考this

希望对你有帮助。

编辑

如果您使用的是 1.11 版,则可以使用 union()

data2 = []
for d in data1:
    ufs = user_files.objects.filter(Filename=d.select_file,user_uploaded=d.from_user)
    data2 = data2.union(ufs)

我没有测试过上面的代码,但你明白了。有关union() 的更多信息,请查看this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2015-09-28
    相关资源
    最近更新 更多