2014-08-28 3 views
0

У меня есть 2 модели Django - ди-джеи и песни. Я пытаюсь получить наборы всех песен с тем же именем для конкретного ди-джея.Почему Django рассматривает эти два одинаковых запроса как разные?

Это, как я делаю, что

for dj in DJ.objects.all(): 
    song_group_list = [] 
    dj_song_list = Song.objects.filter(artist=dj) 
    for song in dj_song_list: 
     song_group = dj_song_list.filter(name=song.name).order_by('song_id') 
     if len(song_group) > 1: 
      if song_group not in song_group_list: 
       song_group_list.append(song_group) 
    for group in song_group_list: 
     print group 

Это выводит 2 повторяющиеся наборы с теми же результатами QuerySet.

[<Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>] 
[<Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>, <Song: Wake Up>] 

Почему not in не в состоянии провести различие между этими 2 querysets?

ответ

0

Глядя на Queryset «s source code я не мог найти __eq__ метод, так что именно поэтому, когда вы сравниваете два различных экземплярам Queryset вы не найдете ни одного матча.

>>> class A(object): 
    pass 

>>> A() == A() 
False 
>>> A() in [A()] 
False 

docs От:

Если нет __cmp__(), __eq__() или __ne__() операция не определена, класс экземпляры сравниваются по идентичности объекта («адрес»).

Смежные вопросы