DRF常用模型和外键
DRF common models and foreign key
我正在尝试为数据库中的所有对象使用一些通用属性,例如 created_by、updated_by、created_when 和 updated_when。
所以我为公共属性创建了一个class:
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
我正在尝试为数据库中的所有对象使用一些通用属性,例如 created_by、updated_by、created_when 和 updated_when。
所以我为公共属性创建了一个class:
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