I have the following Django models:
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)
Now, I want all the common keywords for any two users from the database:
username1 = 'user1'
username2 = 'user2'
Attempt 1:
Keyword.objects.filter(url__user__username=username1).filter(url__user__username=username2).values('keyword', 'url__url').distinct()
// Returns empty list [] [ Wrong ]
Attempt 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 ]
What am I doing wrong in Attempt 1?
Please note: at first .filter(url__user__username=username1).filter(url__user__username=username2)
seems wrong, but it has a many-to-many relationship in which it should work.
Test input for Attempt 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)
Now, I tried Attempt 1 and Attempt 2 on this and got correct result as expected. I get common
as keyword for newuser1
and newuser2
.
Now, Attempt 2 is definitely correct, then what am I doing wrong in Attempt 1?