Модель по умолчанию Django ORM не применяется в кверисете python

У меня есть нижеприведенный Django ORM, который представляет представление PostgreSQL.

Для поля cost_requirement я установил значение по умолчанию 0. Однако объект queryset по-прежнему выдает значение None, если данные для этого поля отсутствуют.

Я сделал все миграции и просто хочу, чтобы значение по умолчанию применялось на стороне Python (ничего общего с базой данных). Как я понял из документации Django, я правильно использую этот аргумент.

Есть предположения, почему не применяется значение по умолчанию 0?

class DashboardProduct(models.Model):
    date = models.DateField()
    product_id = models.CharField(max_length=50)
    base_l = models.FloatField(default=0)   
    cost_requirement =  models.FloatField(blank=False, null=False, default=0)
    book = models.CharField(max_length=100, blank=True, null=True)
    portfolio = models.CharField(max_length=100, blank=True, null=True)
    sales_5_pnl = models.FloatField(default=0)   
    

    class Meta: 
        managed = False 
        db_table = 'view_dashboard_product'

в default=… [Django-doc] - это когда вы создаете записи, но вы здесь работаете с представлением, поэтому оно ничего не создает, а сохраняет результаты запроса. Он не использует default=… в качестве запасного варианта для NULL.

Вы можете использовать coalesce в запросе, например:

from django.db.models import Value
from django.db.models.functions import Coalesce


class DashboardProductManager(models.Manager):
    def get_queryset(self, *args, **kwargs):
        return (
            super()
            .get_queryset()
            .annotate(cost_requirement=Coalesce('_cost_requirement', Value(0)))
        )


class DashboardProduct(models.Model):
    date = models.DateField()
    product_id = models.CharField(max_length=50)
    base_l = models.FloatField(default=0)
    _cost_requirement = models.FloatField(
        db_column='cost_requirement', blank=False, null=False, default=0
    )
    book = models.CharField(max_length=100, blank=True, null=True)
    portfolio = models.CharField(max_length=100, blank=True, null=True)
    sales_5_pnl = models.FloatField(default=0)

    objects = DashboardProductManager()

    class Meta:
        managed = False
        db_table = 'view_dashboard_product'
Вернуться на верх