Как импортировать объект другой модели (А) внутри модели (Б) в Django?

#django #django-models

#джанго #джанго-модели

Вопрос:

Я хочу создать новый объект, ModelB когда будут выполнены определенные условия ModelA . Я новичок в Django, поэтому не могу понять, как именно я могу этого достичь.

Например, у меня есть две модели( Product и ProductVariant ), когда выполняется определенное условие ProductVariant , я хочу рассчитать новое значение объекта в Product модели.

Моя Product модель такая:

 PRODUCT_TYPE = (  ('s', 'simple'),  ('v', 'varaible') )  class Products(models.Model):  name = models.CharField(max_length=250,null=True, blank=True,)  slug = models.SlugField(max_length=200, unique=True,null=True)  short_description = HTMLField()  description = HTMLField()  category = models.ForeignKey(Categories, related_name="products",on_delete=models.SET_NULL,null=True,blank=True,)  brand = models.ForeignKey(Brands,on_delete=models.CASCADE, default=None, null=True, blank=True,)  warranty_support = HTMLField()  product_type = models.CharField(choices=PRODUCT_TYPE, default='simple', max_length=50)  

И моя модель атрибутов продукта выглядит так:

 class ProductVariant(models.Model):  product = models.ForeignKey(Products,on_delete=models.CASCADE)  variant = models.ForeignKey(ProductAttribute,on_delete=models.CASCADE, null = True, default=None)  managed_stock = models.IntegerField(choices=STOCK_MANAGED, default=0)  stock = models.IntegerField(default=None)  stock_threshold = models.IntegerField()  price = models.DecimalField(max_digits=10, decimal_places=2)  sku = models.CharField(max_length= 250, default=None)  sale_price = models.DecimalField(max_digits=10, decimal_places=2)  sale_start_date=models.DateField(auto_now_add=False, auto_now=False, default=None)  sale_end_date=models.DateField(auto_now_add=False, auto_now=False,default=None)  

Я пытаюсь создать regular_price и sale_price на Product модели, если product_type переменная и если sale_end_date больше, чем сегодня. Я хочу установить тот price , у variant которого самая низкая цена.

Я пробовал делать так на Product модели:

 def clean(self):  if self.product_type == 'varaible' and ProductVariant.objects.filter(product=self, variant_count__gt = 1):   self.min_price = ProductVariant.objects.filter(product=self).Min('price')  self.max_price = ProductVariant.objects.filter(product=self).Max('price')  

но я не в состоянии достичь того, чего хочу, Как я могу это сделать?

Ответ №1:

После некоторых исследований и анализа я нашел решение своей проблемы, я публикую решение здесь, чтобы кто-то с подобной проблемой мог извлечь выгоду.

 @property  def get_price(self):  result = dict()  variants = ProductVariant.objects.filter(product=self)  count = variants.count()  if count gt; 1:  min_variant = variants.order_by('price').first()  max_variant = variants.order_by('-price').first()  result['min_price'] = min_variant.price  result['max_price'] = max_variant.price   elif count == 1:  variant = variants.first()  if variant.sale_price:  result['price'] = variant.price  result['sale_price'] = variant.sale_price  sale_variant = variants.order_by('sale_price').first()  result['lowest_sale_price'] = sale_variant.sale_price  result['regular_price'] = sale_variant.price  today = datetime.date.today()  if variant.sale_start_date lt;= today and variant.sale_end_date gt;= today:  result['sale_end_date'] = variant.sale_end_date  else:  result['price'] = variant.price