首页 > 解决方案 > 如何在 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 的新手,这是我的第一个应用程序,所以任何关于如何解决我的问题的帮助或任何其他方法都将不胜感激。

标签: pythondjangodjango-modelsorm

解决方案


由于您的模型继承自产品的模型,因此您使用的是多表继承。现在多表继承会在继承模型和基本模型之间自动创建 OneToOneField 作为 classname_ptr,从产品模型继承的模型具有 product_ptr 字段。由于您的模型具有 product_ptr 字段,因此您应该为您之前保存的现有行添加默认值。

https://docs.djangoproject.com/en/3.0/topics/db/models/#multi-table-inheritance


推荐阅读