requête de jointure interne Django
-
03-07-2019 - |
Question
Je travaille avec django et j'ai du mal à comprendre comment faire des requêtes complexes
Voici mon modèle
class TankJournal(models.Model):
user = models.ForeignKey(User)
tank = models.ForeignKey(TankProfile)
ts = models.DateTimeField(auto_now=True)
title = models.CharField(max_length=50)
body = models.TextField()
class Meta:
ordering = ('-ts',)
get_latest_by = 'ts'
Je dois extraire le nom d'utilisateur en fonction de l'objet tank.
L'objet utilisateur est celui intégré à django .. merci!
EDIT:
j'ai essayé ceci
print User.objects.filter(tankjournal__tank__exact=id)
Il semble ne pas extraire uniquement l'identifiant .. et extraire tout ce qui se trouve dans tankjournal et le faire correspondre à l'objet tank
La solution
Si vous avez déjà votre objet tank , vous devriez pouvoir faire:
tank.user.username
Pour réduire le nombre de requêtes dans la base de données, envisagez d'utiliser select_related ( ) , par exemple
tanks = TankJournal.objects.all().select_related()
for tank in tanks:
username = tank.user.username
si vous avez un identifiant de réservoir spécifique, alors:
tank = TankJournal.objects.select_related().get(id=123456)
username = tank.user.username
Autres conseils
Je comprends peut-être mal votre question, mais une requête sur User.objects.filter ()
renverra une liste d'objets User, et non d'identificateurs d'utilisateurs. Ce que vous avez écrit semble techniquement correct.
N'oubliez pas, cependant, que votre modèle définit un one-to-many entre l'objet TankProfile et le TankJournal. En d'autres termes, un même profil TankProfile peut être associé à plusieurs TankJournal et, par conséquent, à plusieurs utilisateurs. Compte tenu de cela, votre requête fait le bon choix en renvoyant plusieurs utilisateurs.