2016-07-16 4 views
0

У меня есть две модели:Джанго QuerySet двух моделей

class AuthUser(models.Model): 
    id = models.IntegerField(primary_key=True) 
    password = models.CharField(max_length=128) 
    last_login = models.DateTimeField(blank=True, null=True) 
    is_superuser = models.BooleanField() 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=30) 
    email = models.CharField(max_length=254) 
    is_staff = models.BooleanField() 
    is_active = models.BooleanField() 
    date_joined = models.DateTimeField() 
    username = models.CharField(unique=True, max_length=30) 

    class Meta: 
     managed = False 
     db_table = 'auth_user' 

class SocialAuthUsersocialauth(models.Model): 
    id = models.IntegerField(primary_key=True) # AutoField? 
    provider = models.CharField(max_length=32) 
    uid = models.CharField(max_length=255) 
    user = models.ForeignKey(AuthUser, models.DO_NOTHING) 
    extra_data = models.TextField() 

    class Meta: 
     managed = False 
     db_table = 'social_auth_usersocialauth' 
     unique_together = (('provider', 'uid'),) 

мне нужно сделать что-то вроде SQL JOIN между ними и магазин присоединился к таблице в QuerySet.

Я пытался сделать это:

def namedtuplefetchall(cursor): 
    desc = cursor.description 
    nt_result = namedtuple('Result', [col[0] for col in desc]) 
    return [nt_result(*row) for row in cursor.fetchall()] 

def examp(request): 
    context = dict() 
    cursor = connection.cursor() 
    cursor.execute(""" 
    SELECT * 
    FROM auth_user 
    JOIN social_auth_usersocialauth 
    ON auth_user.id = social_auth_usersocialauth.user_id 
    """) 
    context['usersauth'] = namedtuplefetchall(cursor) 
    return render(request, 'try.html', context) 

Но я исключение Обнаружен дубликат имя поля: «идентификатор», который я не знаю, как обращаться.

ответ

1

Если добавить переименование = True атрибут namedtuple называть

namedtuple('Result', [col[0] for col in desc], rename=True) 
0

Вы должны использовать select_related и prefetch_related для этих целей.
Если вы хотите получить таблицу из соответствующей модели, используйте «select_related»:

SocialAuthUsersocialauth.objects.select_related('user') 

Если вы хотите получить все связанные таблицы, используйте «prefetch_related»:

AuthUser.objects.prefetch_relatd('socialauthusersocialauth_set') 

Это добавит к вашему querysets дополнительного атрибут, с именем связанной области. Также лучше добавить атрибут related_name в ForeignKey для более явного использования.