如何在 Django 中的模型 (B) 中导入另一个模型 (A) 的对象?

How to import a object of another model (A) inside model (B) in Django?

我想在 ModelA 中满足特定条件时在 ModelB 中创建一个新对象。我是 Django 的新手,所以我无法弄清楚如何才能实现这一目标。

例如我有两个模型(ProductProductVariant),当满足 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)

我正在尝试在 Product 模型上创建 regular_pricesale_price,如果 product_type 是可变的并且 sale_end_date 大于今天。我想从价格最低的 variant 设置 price

我试过在 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')

但我无法实现我想要的, 我该怎么做?

经过一些研究和分析,我找到了解决问题的方法,我将解决方案发布在这里,以便有类似问题的人受益。

@property
    def get_price(self):
        result = dict()
        variants = ProductVariant.objects.filter(product=self)
        count = variants.count()
        if count > 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 <= today and variant.sale_end_date >= today:
                    result['sale_end_date'] = variant.sale_end_date
            else:
                result['price'] = variant.price