python - 如何在 Django 中添加多态类?
问题描述
我正在尝试在 django 申请一家餐厅;我必须为不同类型的项目创建一个菜单,所有这些不同类型的项目本质上必须是一个产品,这样我就可以将该产品添加到用户的相应购物车中。这是我的菜单项:
from django.db import models
from django.contrib.auth.models import User
class Product(models.Model):
price = models.DecimalField(decimal_places=2, max_digits=10)
class Pizza(Product):
pizzatype = models.CharField(max_length=15)
extras = models.TextField(max_length=50)
size = models.CharField(max_length=10)
class Subs(Product):
name = models.TextField(max_length=64)
size = models.CharField(max_length=10)
class DinnerPlatters(Product):
name = models.TextField(max_length=64)
size = models.CharField(max_length=10)
class Pasta(Product):
name = models.TextField(max_length=64)
class Salads(Product):
name = models.TextField(max_length=64)
可以看出,我尝试从单个模型Product派生不同类型菜单项的模型,但是在运行时makemigrations
,我在终端上收到以下消息:
You are trying to add a non-nullable field 'product_ptr' to dinnerplatters without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit, and let me add a default in models.py
我尝试用谷歌搜索我的问题的解决方案,但找不到合适的解决方案。
我是 Django 的新手,这是我的第一个应用程序,所以任何关于如何解决我的问题的帮助或任何其他方法都将不胜感激。
解决方案
由于您的模型继承自产品的模型,因此您使用的是多表继承。现在多表继承会在继承模型和基本模型之间自动创建 OneToOneField 作为 classname_ptr,从产品模型继承的模型具有 product_ptr 字段。由于您的模型具有 product_ptr 字段,因此您应该为您之前保存的现有行添加默认值。
https://docs.djangoproject.com/en/3.0/topics/db/models/#multi-table-inheritance
推荐阅读
- email - 启动 Viber 并在桌面应用程序中发送带有链接、电子邮件、批处理的消息
- javascript - JavaScript 练习逻辑运算符(不起作用)
- python - 对 numpy 数组子类的操作的不需要的包装结果
- react-native - 一种形式,但不同的状态
- javascript - 如何获取 AnimatedInterpolation 的值
- linux - 如果 ping 成功,Linux shell (sh) CLI 测试
- java - Kotlin:将日期字符串转换为 ISO 字符串
- r - 通过保持指标变量从年份数据创建月度数据
- oracle - 将 HIVE 数据库复制到 Oracle
- wpf - 高度和宽度改变后,WPF MVVM在屏幕上重新居中应用程序?