2016-05-16 5 views
1

J'ai 3 modèles Matériel, UDM, BIN_UOMobjet 'QuerySet' n'a pas d'attribut '- numéro Django ORM

@with_author 
    class Material(models.Model): 
     version = IntegerVersionField() 
     code = models.CharField(max_length=30) 
     name = models.CharField(max_length=30) 
     slug = models.SlugField(max_length=80, blank=True) 
     description = models.TextField(null=True, blank=True) 
     materialuom = models.CharField(max_length=1, 
            choices=UOM_CHOICES) 
     creation_time = models.DateTimeField(auto_now_add=True, blank=True) 
     itemgroup = models.ForeignKey(ItemGroup, on_delete=models.PROTECT) 
     keywords = models.CharField(max_length=50,null=True, blank=True) 
     valid_from = models.DateTimeField(null=True, blank=True) 
     valid_to = models.DateTimeField(null=True, blank=True) 
     min_quantity = models.DecimalField(max_digits=19, decimal_places=10) 
     trigger_quantity = models.DecimalField(max_digits=19, decimal_places=10) 
     max_quantity = models.DecimalField(max_digits=19, decimal_places=10) 

    @with_author 
    class UOM(models.Model): 
     version = IntegerVersionField() 
     code = models.CharField(max_length=30) 
     name = models.CharField(max_length=30) 
     material = models.ForeignKey(Material) 
     description = models.TextField(null=True, blank=True) 



@with_author 
class UOM_BINUOM(models.Model): 
    version = IntegerVersionField() 
    UOM = models.ForeignKey(UOM) 
    BIN_UOM = models.ForeignKey(BIN_UOM) 
    quantityperunit = models.PositiveSmallIntegerField() 
    creation_time = models.DateTimeField(auto_now_add=True,blank=True) 

Sur l'entrée, j'ai mon ID matériel

En utilisant ORM django Je veux obtenir tous les objets de UOM_BINUOM de mon identifiant matériel.

Dans SQL:

Select * from UOM_BINUOM where UOM_BINUOM.uom in (Select uom from UOM where UOM.material = material) 

En ORM Je suis en train de comme ceci:

uombinuom = UOM.objects.filter(material__in=material_id).uom_binuom_set.all().order_by('-id') 

ou comme celui-ci

material = get_object_or_404(Material, pk=material_id) 
    uom = material.uom_set.all().order_by('-id') 
    uombinuom = uom.uom_binuom_set.all().order_by('-id') 

mais obtenir erreur

« QuerySet 'objet n'a pas d'attrib Qu'est-ce que je fais mal et comment puis-je résoudre ce problème?

+0

Est-ce que 'material_id' est une liste d'ID ou un ID unique? – Alasdair

+0

material_id est ID unique –

Répondre

1

Le uom_binuom_set est pour un seul UOM exemple

UOM.objects.get(pk=1).uom_binuom_set.all() 

Cependant, vous avez UOM_BINUOM.objects.filter(...), qui est un queryset. Comme l'erreur l'indique, le queryset n'a pas la méthode uom_binuom_set.

Vous pouvez construire le jeu de requête souhaité en commençant par le modèle UOM_BINUOM.

uombinuom = UOM_BINUOM.objects.filter(UOM__material=material_id) 

Notez que depuis material_id est un identifiant unique, vous n'avez pas besoin d'utiliser __in.

1

Lorsque vous faites

uom = material.uom_set.all().order_by('-id') 

est un QuerySet ici. uom_binuom_set doit être appelée sur un enregistrement unique et non sur QuerySet d'enregistrements. Vous devrez donc parcourir le jeu de requêtes et appeler le .uom_binuom_set.all() pour chaque enregistrement.

for record in uom: 
    uom_binuom = record.uom_binuom_set.all() 
    # do something with uom_binuom 

Ou si vous ne souhaitez que les premiers enregistrements liés uom_binuom puis

uom_binuom = uom.first().uom_binuom_set.all()