0

我有一个文件、用户和共享模型,如下所示:

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

没弄对。我想获得整个特定文件共享的用户名。我怎样才能做到这一点?

4

1 回答 1

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-如果你Share.shared_user_id用 OnetoMany 字段替换你的模型会更正确,你的查询会更容易。

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

3- 你不应该为外键使用复数 var 名称,因为它们代表一个对象。File.users应该是File.user和相同Share.filesShare.users

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

于 2013-03-17T04:53:41.580 回答