次のDjangoモデルがあります:
class User(models.Model):
username = models.CharField(max_length=50, unique=True)
name = models.CharField(max_length=100)
class Url(models.Model):
user = models.ManyToManyField(User)
url = models.URLField()
class Keywords(models.Model):
url = models.ManyToManyField(Url)
keyword = models.CharField(max_length=100)
ここで、データベースから任意の 2 人のユーザーに共通するすべてのキーワードが必要です。
username1 = 'user1'
username2 = 'user2'
試行 1:
Keyword.objects.filter(url__user__username=username1).filter(url__user__username=username2).values('keyword', 'url__url').distinct()
// Returns empty list [] [ Wrong ]
試行 2:
k1 = [ k.keyword for k in Keyword.objects.filter(url__user__username=username1) ]
k2 = [ k.keyword for k in Keyword.objects.filter(url__user__username=username2) ]
common_k = list(set(k1).intersection(set(k2)))
print common_k
// Return list of common keys (As Expected) [ Correct ]
試行1で何が間違っていますか?
注意: 最初.filter(url__user__username=username1).filter(url__user__username=username2)
は間違っているように見えますが、多対多の関係で動作するはずです。
試行 1 のテスト入力
newuser1 = User.objects.get(username='newuser1')
newuser2 = User.objects.get(username='newuser2')
url = Url(url='http://common.com/')
url.save()
url.user.add(newuser1)
url.user.add(newuser2)
key = Keyword(keyword='common')
key.save()
key.url.add(url)
ここで、試行 1 と試行 2 を試してみたところ、期待どおりの正しい結果が得られました。common
とのキーワードとして取得newuser1
しnewuser2
ます。
さて、試行 2 は間違いなく正しいのですが、試行 1 で何が間違っているのでしょうか?