0

これが私のモデルデザインです:

class Group(models.Model):
    name  = models.CharField(max_length=30)
    ...

class User(models.Model):
    name              = models.CharField(max_length=50)
    ...
    group             = models.ForeignKey(Group)

class Photo(models.Model):
    title                = models.CharField(max_length=100)
    ...
    user                 = models.ForeignKey(User)

各グループの下に、グループに属するユーザーに属する5枚のランダムな写真のすべてのグループのリストを取得するにはどうすればよいですか?

私は試した:

g = Group.objects.all()

for group in g:
    r = Photo.objects.filter(user.group=group).order_by('?')[:5]

それは与えています:

Django Version: 1.4.3
Exception Type: SyntaxError
Exception Value:    
keyword can't be an expression (views.py, line 37)
Exception Location: /PATH/python2.7/site-packages/django/utils/importlib.py in import_module, line 35
Python Executable:  /PATH/python
Python Version: 2.7.3

しかし、私のコードが機能したとしても、生成されるクエリが多すぎるため、理想的な方法ではないと思います。

助けてください。

4

1 に答える 1

2

user.groups問題は、関数のキーワード引数として使用できないことです.filter(…)

代わりにuser__groups=group、ユーザー -> グループの関係を広げるために使用します。

Photo.objects.filter(user__group=group).order_by('?')[:5]

関連ドキュメント: https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

残念ながら、for ループを取り除くのは、クエリから上位 N 行をクエリGROUP BYする必要があるため、かなりトリッキーです。したがって、多数のグループがない限り、Python の for ループがおそらく最も簡単です。それを行う方法。

とはいえ、パフォーマンスが重要な場合は、注文するのRANDOM()も非常に遅いため、おそらくよりスマートなソリューションを考え出す必要があります…</p>

于 2012-12-25T19:18:54.760 に答える