需要帮助从django

时间:2017-10-25 10:20:34

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

我有以下两种型号,

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按用户bb存储共享文件名yo user xx。

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

我在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中选择的所有用户和文件名。然后想在模板中渲染它。

如何实现?需要帮助。

提前致谢。

2 个答案:

答案 0 :(得分:0)

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()

答案 1 :(得分:0)

.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)

侧面说明 - 您的模型设计看起来不太好。考虑使用ForeignKey。有关详情,请参阅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