2015-11-04 2 views
0

Я создал метод в своих моделях, который проверяет баланс запасов для моего приложения для веб-магазина.Django: объект 'Manager' не имеет атрибута 'get_quantity_sum'

models.py:

class ProductVariantSize(models.Model): 
    product_variant = models.ForeignKey('ProductVariant', related_name='sizes') 
    size = models.ForeignKey('Size') 
    available_qty = models.IntegerField(default=0) 

    def __unicode__(self): 
     return u'%s %d kom' % (lang.resolve_dict(self.size.name), self.available_qty) 

    def stock_check(self): 
     from webshop.models import OrderDetail 

     sold_sum = OrderDetail.objects.filter(
      variant=self.product_variant, size = self.size).aggregate(
      total_quantity=Sum('quantity'))['total_quantity'] 
     receipt_sum = ReceiptDetail.objects.filter(
      variant=self.product_variant, size = self.size).aggregate(
      total_quantity=Sum('quantity'))['total_quantity'] 
     bill_of_lading_sum = BillOfLadingDetail.objects.filter(
      variant=self.product_variant, size = self.size).aggregate(
      total_quantity=Sum('quantity'))['total_quantity'] 
     stock_return_sum = StockReturnDetail.objects.filter(
      variant=self.product_variant, size = self.size).aggregate(
      total_quantity=Sum('quantity'))['total_quantity'] 

     total_sum = receipt_sum - sold_sum - bill_of_lading_sum - stock_return_sum 
     if self.available_qty != total_sum: 
      return False 
     return True 

Как вы можете видеть мои QuerySet фильтры все равно. Я хочу использовать django custom manager здесь, но я не могу заставить его работать. Вот что я пытался:

class SumManager(models.Manager): 
    def get_quantity_sum(self): 
     qs = self.get_queryset() 
     return qs.filter(
      variant=self.product_variant, size = self.size).aggregate(
      total_quantity=Sum('quantity'))['total_quantity'] 


class ProductVariantSize(models.Model): 
    product_variant = models.ForeignKey('ProductVariant', related_name='sizes') 
    size = models.ForeignKey('Size') 
    available_qty = models.IntegerField(default=0) 

    objects = SumManager() 

    def __unicode__(self): 
     return u'%s %d kom' % (lang.resolve_dict(self.size.name), self.available_qty) 

    def stock_check(self): 
     from webshop.models import OrderDetail 

     sold_sum = OrderDetail.objects.get_quantity_sum() 
     receipt_sum = ReceiptDetail.objects.get_quantity_sum() 
     bill_of_lading_sum = BillOfLadingDetail.objects.get_quantity_sum() 
     stock_return_sum = StockReturnDetail.objects.get_quantity_sum() 

     total_sum = receipt_sum - sold_sum - bill_of_lading_sum - stock_return_sum 
     if self.available_qty != total_sum: 
      return False 
     return True 

я получаю следующее сообщение об ошибке:

'Manager' object has no attribute 'get_quantity_sum'

+0

сообщение об ошибке довольно ясно, что это не ?: У вас нет менеджера в месте, которое вы хотите использовать. Вам нужно назначить его. –

ответ

2

Вы должны определить свой собственный менеджер по модели, которую вы хотите использовать его. Таким образом, в вашем коде вы определили objects = SumManager() на ProductVariantSize, однако вы пытаетесь вызвать метод SumManagerget_quantity_sum() на всех остальных моделях (например, OrderDetail).

Если вы хотите позвонить OrderDetail.objects.get_quantity_sum(), вам нужно будет определить свой собственный менеджер по OrderDetail

+0

Ty, когда при добавлении объектов = SumManager() в каждую модель деталей, которые я использую, она работала как шарм. –

Смежные вопросы