Django 如何找到与之共享文件的用户的名称?
我有这样的文件、用户和共享模型:Django 如何找到与之共享文件的用户的名称?,django,django-queryset,Django,Django Queryset,我有这样的文件、用户和共享模型: class File(models.Model): users = models.ForeignKey(User) file_name = models.CharField(max_length=100) type = models.CharField(max_length=10) source = models.CharField(max_length=100) start_date = models.TextField
class File(models.Model):
users = models.ForeignKey(User)
file_name = models.CharField(max_length=100)
type = models.CharField(max_length=10)
source = models.CharField(max_length=100)
start_date = models.TextField()
time_overview = models.CharField(max_length=55)
end_date = models.TextField()
duration = models.TextField()
size_overview = models.IntegerField()
size = models.TextField()
flag = models.TextField()
flag_r = models.TextField()
class Share(models.Model):
users = models.ForeignKey(User)
files = models.ForeignKey(File)
shared_user_id = models.IntegerField()
shared_date = models.TextField()
我使用此查询找到了与之共享特定文件的用户数:
shared_file = File.objects.filter(id__in= Share.objects.filter(users_id = log_id).values_list('files', flat=True)).annotate(count=Count('share__shared_user_id'))
现在,我想找出与之共享特定文件的用户名。
尝试使用以下方法:
shared_username = User.objects.filter(id__in= Share.objects.filter(users_id = log_id).values_list('shared_user_id', flat=True))
没有弄对。我想得到整个用户名和特定文件的共享。如何执行此操作?在第二个查询中添加特定文件名的条件:
shared\u username=User.objects.filter(id\u-in=Share.objects.filter(users\u-id=log\u-id,files\u-file\u-name='file1')。值列表('shared\u-User\u-id',flat=True))
但是,您的模型存在一些值得注意的问题: 1-如果您使用OnetoMany字段替换
Share.shared\u user\u id
,您的模型将更加正确,您的查询将更加容易
2-如果您在外键上使用related_name
,您可以从相反的型号访问外键,您的查询将更加容易
3-外键不应使用复数var名称,因为它们代表一个对象File.users
应该是File.user
,对于Share.files
和Share.users
4-如果正确命名变量,模型的可读性会更高。例如,您可以使用
File.owner
或File.owning\u user
而不是File.users
。与Share.users
相同:Share.sharing\u user
什么是shared\u user\u id?为什么不是外键?当你已经有了用户的外键时,为什么会有呢?log_id是当前登录的用户。log_id=request.user.id和shared_user_id是与之共享文件的用户。users是与之共享文件的用户,shared_user_id是与之共享文件的用户。好的,收到了。我正在写一个答案,几分钟后会发布,文件中的用户是文件的所有者?哪一个可能与共享它的人不同?我循环了一下,找到了它的用户名,它为我提供了所有文件的用户名。例如:文件ok.txt可以与用户“hello”共享,文件“e.txt”可以与用户“fds”和“sdf”共享。这个查询提供了每个文件的所有用户名,但我不希望这样。我只想找到特定文件的用户名。请参阅更新的答案:将文件\u文件\u名称='asd.txt'
添加到筛选器。所有文件都在共享文件查询的一行中填充。当用户单击时,每个文件都会有一个共享的\u no,只需显示特定文件的共享\u用户名。在一句话中,您可以编写您想要的查询吗?“与他们共享文件1的用户列表”是shared\u username=user.objects.filter(id\u In=Share.objects.filter(files\u file\u name='file1')。值\u列表('shared_user_id',flat=True))