2017-08-17 1 views
1

J'ai une table nommée Profil avec le code ci-dessous:comment obtenir un objet en fonction du champ de la table parent dans django ORM?

class Profile(models.Model): 
    user = models.OneToOneField('auth_user', 
      related_name='profile', verbose_name='profile', on_delete=models.CASCADE) 
    name = models.CharField(max_length=30, verbose_name='name') 
    family = models.CharField(max_length=50, verbose_name='family') 

et la table utilisateur est comme ci-dessous:

class User(models.Model): 
    id = models.IntegerField(primary_key=True) 
    username = models.CharField(max_lenght=255) 
    password = models.CharField(max_lenght=255) 

Je veux obtenir des profils avec nom d'utilisateur avec cette fonction:

def get_profile(request, username): 
    # some codes 

comment puis-je obtenir un profil avec nom d'utilisateur? que devrais-je écrire dans la fonction get_profile? tanx

Répondre

0

Vous pouvez utiliser get() recherche:

def get_profile(request, username=None): 
    profile = Profile.objects.get(user__username=username) 

Mais cela peut provoquer une erreur s'il n'y a pas un tel utilisateur. Ainsi, une meilleure approche consiste à utiliser shortcuts.get_object_or_404():

from django.shortcuts import get_object_or_404 


def get_profile(request, username=None): 
    profile = get_object_or_404(Profile, user__username=username) 

Si vous êtes confondu avec le un double underscore syntaxe (user__username=username), vérifier the docs for field lookups.

+0

J'ai écrit le code que vous m'avez donné, mais cela n'a pas fonctionné. il déclenche une erreur avec ce message: AttributeError at/mojtaba/ L'objet de type 'Profile' n'a pas d'attribut 'model' non seulement si j'entre un vrai nom d'utilisateur, mais aussi quand j'entre un faux nom d'utilisateur (qui n'est pas dans la base de données), de toute façon il soulève cette erreur. – msln

+0

Pouvez-vous montrer votre vue complète 'get_profile'? – wencakisa

+0

qu'il est: def get_profile (demande, nom d'utilisateur = Aucun): profil = get_object_or_404 (Profil, user__username = nom d'utilisateur) impression (profil) passe – msln