2010-10-01 2 views
0

Guys, Existe-t-il un moyen facile de renvoyer différents noms de champs de différents modèles en chaînant des jointures? Mon modèle:Django obtenant des noms de champs de différents modèles

Class Item(models.Model): 
    item_code = models.CharField(max_length=10) 
    name = models.CharField(max_length=255) 
    ... 

Class Stock(models.Model): 
    item_code = models.ForeignKey(Item) 
    userid = models.ForeignKey(User) 
    qty = models.IntegerField() 
    ... 

Je veux choisir "Item.Item_code, Item.name, Stock.qty où Stock.userid = 2 et Item.item_code = Stock.Item_Code"

Comment faire Je fais ça à Django?

Gath

Répondre

1
  1. d'abord tous les changements fileds noms
  2. Lire cette très carefuly http://docs.djangoproject.com/en/dev/ref/models/querysets/

    Class Item(models.Model): 
        item_code = models.CharField(max_length=10) 
        name = models.CharField(max_length=255) 
        ... 
    Class Stock(models.Model): 
        item = models.ForeignKey(Item) 
        user = models.ForeignKey(User) 
        qty = models.IntegerField() 
        ... 
    
    
    #view 
    stocks = Stock.objects.filter(user=2) 
    for stock in stocks: 
        print stock.item.item_code, stock.item.name 
    #one query version 
    
2

Je veux sélectionner "Item.Item_code, Item.name, Stock.qty où Stock.userid = 2 et Item.item_code = Stock.Item_Code"

Vous pouvez choisissez ces champs spécifiques seulement en utilisant un SQL, à condition de commencer par le modèle Stock. Par exemple

q = Stock.objects.select_related('userid', 'item_code').filter(
    userid__id = 2).values('item_code__item_code', 'item_code__name', 'qty') 

Cela aidera si vous souhaitez limiter les données et le nombre de requêtes. Si vous n'êtes pas concernés par ce alors faire:

q = Stock.objects.filter(userid__id = 2) 
for stock in q: 
    print stock.item_code.item_code 
    print stock.item_code.name 
    print stock.qty 

Cela renverra un queryset uniquement avec les champs que vous avez values choisissez Via. Vous pouvez ensuite itérer à travers.

PS: Re: vos modèles.

Class Stock(models.Model): 
    item_code = models.ForeignKey(Item) 
    userid = models.ForeignKey(User) 
    qty = models.IntegerField() 
    ... 

C'est une bonne idée d'utiliser le nom du modèle en minuscules pour les relations FK. Par exemple vous devez écrire:

Class Stock(models.Model): 
    item = models.ForeignKey(Item) # Changed 
    user = models.ForeignKey(User) # Changed 
    qty = models.IntegerField() 
    ... 
2

Vous pouvez également utiliser ceci:

Stock.objects.filter(user=2).values('item__item_code', 'item__name') 
Questions connexes