我有以下两种型号,
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中选择的所有用户和文件名。然后想在模板中渲染它。
如何实现?需要帮助。
提前致谢。
答案 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。