Модель по умолчанию 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'