2016-07-16 12 views
0

Ich habe zwei Modelle:django queryset von zwei Modellen

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'),) 

Ich brauche so etwas wie SQL JOIN zwischen ihnen und zu speichern verknüpften Tabelle in queryset zu machen.

Ich habe versucht, dies zu tun:

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) 

Aber ich hatte Namen Ausnahme Encountered doppelten Feld: ‚id‘, die ich weiß nicht, wie zu behandeln.

Antwort

1

Sollte Umbenennungs = True Attribut in den

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

namedtuple rufen Sie select_related und prefetch_related für diese Zwecke verwendet werden soll.
Wenn Sie Tabelle wollen aus verwandten Modell erhalten, verwenden ‚select_related‘:

SocialAuthUsersocialauth.objects.select_related('user') 

Wenn Sie alle verknüpften Tabellen erhalten möchten, verwenden Sie ‚prefetch_related‘:

AuthUser.objects.prefetch_relatd('socialauthusersocialauth_set') 

es zu Ihrem querysets hinzufügen zusätzliche Attribut, mit dem Namen des verwandten Felds. Fügen Sie auch besser das Attribut related_name in ForeignKey für eine explizitere Verwendung hinzu.