如何查找与其共享文件的用户的名称?

时间:2013-03-17 03:19:03

标签: 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()
    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))

没有做对。我想获得用户名,整个特定文件是共享的。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

在第二个查询中添加特定文件名的条件:

shared_username = User.objects.filter(id__in = Share.objects.filter(users_id = log_id, files__file_name='file1').values_list('shared_user_id', flat=True))


但是你的模型有一些值得注意的问题:

1-如果您使用OnetoMany字段替换Share.shared_user_id,您的模型会更正确,您的查询也会更容易。

2-如果您在外键上使用related_name,则可以从相反的型号访问它们,您的查询会更容易。

3-您不应对外键使用复数var名称,因为它们代表一个对象。对于File.usersFile.user

Share.files应为Share.users且相同

4-如果您正确命名您的vars,您的模型可以更具可读性。例如,您可以使用File.usersFile.owner代替File.owning_user。与Share.users相同:Share.sharing_user