Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 如何找到与之共享文件的用户的名称?_Django_Django Queryset - Fatal编程技术网

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