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

2番目のクエリで特定のファイル名の条件を追加します。

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_idOnetoManyフィールドに置き換えると、モデルがより正確になり、クエリがはるかに簡単になります。

2-related_name外部キーを使用する場合は、反対のモデルからそれらにアクセスでき、クエリがはるかに簡単になります。

3-外部キーは1つのオブジェクトを表すため、複数のvar名を使用しないでください。と同じであるFile.users必要がありますFile.userShare.filesShare.users

4-変数に適切な名前を付けると、モデルがはるかに読みやすくなる可能性があります。たとえば、代わりにまたはFile.usersを使用できます。と同じ:。File.ownerFile.owning_userShare.usersShare.sharing_user

于 2013-03-17T04:53:41.580 に答える