Django hataya bakar mısınız?

Ürün ekle modelim var : ürün adı ve stok alanı
stok ekleme modelimden bir ürünü seçip kaydet dediğimde Product modelindeki stokun artmasını istiyorum. Nasıl yapabilirim id de hata veriyor.

class Product(models.Model):
    product_name = models.CharField(max_length=100)
    stock = models.DecimalField(default=0.0, max_digits=11, decimal_places=2)


class StockAdd(models.Model):
    product_id = models.ForeignKey(Product, on_delete=models.CASCADE)
    count = models.DecimalField(default = 0.0, max_digits=11, decimal_places=2)
    price = models.DecimalField(default=0.0, max_digits=11, decimal_places=2)
    date = models.DateField(auto_now_add=True)

    def save(self):
        a = Product.objects.get(id= self.product_id)
        a.stock = a.stock + self.count
        a.save

aldığım hata save fonksiyonunda

Field ‘id’ expected a number but got <Product: Bidon 5 litre>.

bkz. Soru Sorarken Sikca Dusulen Hatalar #1

1 Beğeni
    a = Product.objects.get(id= self.product_id)

bu satırı değiştirmeniz lazım.

şu ikisini sırayla deneyebilir misiniz.

    a = Product.objects.get(id= self.product_id.id)

number istiyordu biz de id göndermiş olduk.

    a = self.product_id

number göndermekle uğraşmayıp doğrudan ürünü gönderdik.

bir de save metodunu override ederken StockAdd nesnesinin kaydedilme özelliğini kaldırmış oldun. Eğer bunu kasıtlı yaptıysan StockAdd class ını komple iptal edip Product class ı içinde method olarak tanımlamayı düşünebilirsin.
Yok bilerek değil de hatalı olarak StockAdd kaydedilme özelliğini sildiysen; “django override methods” gibi bir arama yaparak biraz incelemelisin.

Düzelttim teşekkür ederim açıklama için.

Dostum şimdi Stok eklerken Product tablosundaki stock alanını arttırmak istiyorum. Aşağıda tablom. Bidon 5 litre diye bir ürün tanımladım. Başlangıçta degeri 0. Ben stockadd tablosuna bir alım yaptığımda product tablosundaki stock degerinin artmasını istiyorum. Bunu normal htmlde view ile yapabilirim ama admin panelde direk yapmak istiyorum.

Bu product tablom:

Bu da stockadd tablom: Burda Bidon 5 litre ürününden 15 adet almışım. Bu 15 in product tablosundaki stock alanına işlenmesini istiyorum.

Yani stok eklenirken diğer tablodaki stock alanına da count işlensin.

Yaptım :slight_smile:

def save(self, *args, **kwargs):
        
        a = Product.objects.get(id= self.product_id.id)
        a.stock = a.stock + self.count

        a.save()

        super().save(*args, **kwargs)

Şimdi aynı işlemi ürünü silerken veya güncellerken yapmam lazım. Aynı mantıkla delete metodu stock azaltmadı. Seçilen ürünleri silerken stok azaltmasını nasıl yapabiliriz?

    def delete(self, *args, **kwargs):

        a = Product.objects.get(id= self.product_id.id)
        a.stock = a.stock - self.count
        
        a.save()

        super().delete(*args, **kwargs)

Yok mu fikri olan? Admin panelinde delete ve update fonksiyonlarina nasıl ulaşıyoruz?

StockAdd modelinin adını Stock diye değiştir. Admin tarafında ekleme vs işlemi için admin action ile form vs olustuman lazım. Sen direk model içinde save fonksiyonunu kullanıyorsun bu doğru bir kullanım değil.

İptal ettim o kismi.