Rahul Sharma
Rahul Sharma

Reputation: 2495

Loop over django object

I have a model like this:

class Grn(models.Model):

    owner = models.ForeignKey(Employee, on_delete=models.CASCADE, related_name='grn_owner')
    warehouse = models.ForeignKey(Warehouse, on_delete=models.CASCADE, related_name="grn_warehouse")
    vendor = models.ForeignKey(Vendor, on_delete=models.CASCADE, related_name="grn_vendor")   

    product1 = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='grn_product1')
    product1_quantity = models.IntegerField(default=0)

    product2 = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='grn_product2', blank=True, null=True)
    product2_quantity = models.IntegerField(default=0, blank=True, null=True)

    product3 = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='grn_product3', blank=True, null=True)
    product3_quantity = models.IntegerField(default=0, blank=True, null=True)

    product4 = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='grn_product4', blank=True, null=True)
    product4_quantity = models.IntegerField(default=0, blank=True, null=True)

How can I loop over an object of this model? I tried something like this:

class GRNFormView(CreateView):
    model = Grn
    template_name = 'GrnForm.html'
    form_class = Grnform

    def form_valid (self, form):
        data = form.save(commit=False)
        print("form.cleaned_data is ", form.cleaned_data)
        data.owner = Employee.objects.filter(user = self.request.user.id)[0]
        data.save()
        print("data is", data)
        for i in range(1,5):
            if data.product(i):
                print("product ", data.product(i))
            else:
                pass

How can I check if a product exists in an object and get its value ?

Upvotes: 0

Views: 23

Answers (1)

kichik
kichik

Reputation: 34704

You can use getattr() to dynamically access the products.

    for i in range(1,5):
        if getattr(data, f"product{i}"):
            print("product ", getattr(data, f"product{i}"))
        else:
            pass

You can also just use many-to-many relationship with:

products = models.ManyToManyField(Product)

And then access with:

data.products.all()

Upvotes: 2

Related Questions