django-rest-framework - DRF常用模型和外键
问题描述
我正在尝试为数据库中的所有对象使用一些通用属性,例如 created_by、updated_by、created_when 和 updated_when。
所以我为公共属性创建了一个类:
class CommonModel(models.Model):
"""Common fields that are shared among all models."""
created_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT,
editable=False, related_name="+")
updated_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT,
editable=False, related_name="+")
created_at = models.DateTimeField(auto_now_add=True,
editable=False)
updated_at = models.DateTimeField(auto_now=True,
editable=False)
然后我参考我的模型中的通用模型:
class Tag(CommonModel):
"""Tag to be used for products"""
name = models.CharField(max_length=255)
def __str__(self):
return self.name
class Vendor(CommonModel):
"""Vendor to be used for products"""
name = models.CharField(max_length=255, unique=True)
def __str__(self):
return self.name
但是,当我将另一个模型中的标签或供应商称为 foreign_key 时,执行迁移时会出错。
class Product(CommonModel):
"""Model for the type of a product"""
product_id = models.CharField(max_length=255, unique=False)
description = models.CharField(max_length=255, unique=False, null=True, blank=True, default='')
vendor = models.ForeignKey(Vendor, blank=False, null=False, on_delete=models.SET_DEFAULT)
tag = models.ForeignKey(Tag, null=True, blank=True, on_delete=models.SET_NULL)
错误信息:
SystemCheckError: System check identified some issues:
ERRORS:
core.Product.tag: (models.E006) The field 'tag' clashes with the field 'tag' from >model 'core.commonmodel'.
core.Product.vendor: (models.E006) The field 'vendor' clashes with the field 'vendor' from model 'core.commonmodel'.
在我介绍常用模型之前它运行良好。
解决方案
您需要在 Meta 中设置抽象,之后它应该可以正常工作。
class CommonModel(models.Model):
"""Common fields that are shared among all models."""
created_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT,
editable=False, related_name="+")
updated_by = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.PROTECT,
editable=False, related_name="+")
created_at = models.DateTimeField(auto_now_add=True,
editable=False)
updated_at = models.DateTimeField(auto_now=True,
editable=False)
class Meta:
abstract = True
推荐阅读
- node.js - Google Translate API:音译输入
- mysql - 如何通过将一个表中的日期与另一个表中最接近和之前的日期匹配来连接两个表
- python - PyOpenCl 简单矩阵乘法
- authentication - JSF 2.3 基于表单的登录和 ViewExpiredException
- sql - 使用 SQL 文件作为 React Native 数据的数据存储库
- c - 如何将标准输入返回到控制台?
- sass - 是否可以使用 SASS 创建包含选择器的函数(或其他东西)?
- python - 如何通过 MCP3008 将 E-201C pH 传感器与树莓派接口
- python - 移动平均线交叉的错误结果
- typescript - openpgp.decrypt 在开玩笑时返回空字符串