任何人都知道如何创建外键字段并使其始终指向相同的模型,到目前为止我得到了这些。
class PanMachineTimeUnitField(models.ForeignKey):
def __init__(self, **kwargs):
to = 'panbas.PanBasTimeUnit'
kwargs['verbose_name'] = _('Machine Unit')
kwargs['related_name'] = 'machine_unit'
super(PanMachineTimeUnitField, self).__init__(to, **kwargs)
但是我在开始时遇到错误。
我的目标是使用它,
machine_unit = PanMachineTimeUnitField()
不需要进一步的声明。
编辑:
我想要这个,因为我会在一些安静的地方拥有这个外键。如果我想更改字段的verbose_name,我希望我的所有字段都受到此更改的影响。详细名称是一个例子,它可能是另一个属性。
我也不想使用设置 py 来声明默认值。
最佳答案
我建议您只使用 简单功能创建一个类似的预配置的 ForeignKey 实例:(不是 ForeignKey 的子类的实例)
def pan_machine_time_unit_field(**kwargs):
othermodel = 'panbas.PanBasTimeUnit'
on_delete = models.DO_NOTHING # or what you need
kwargs['verbose_name'] = 'Machine Unit'
kwargs.setdefault('related_name', '+')
# or: kwargs.setdefault('related_name', "%(app_label)s_%(class)s_related",
return models.ForeignKey(othermodel, on_delete, **kwargs)
class C(models.Model):
machine_unit = pan_machine_time_unit_field()
# or:
# machine_unit = pan_machine_time_unit_field(related_name='klass_c_children')
related_name
属性是用于与 othermodel
的目标对象的反向关系的名称。引用它的所有对象。该名称在其他模型上必须是唯一的('panbas.PanBasTimeUnit',通常具有足够唯一的应用程序和类名)或者该名称可以是 '+'
如果您不想创建向后关系查询集。示例中暗示了这两种变体。还记得on_delete
.如果你真的需要创建一个子类(如果需要定制更多的方法,这很有意义),你还必须定义一个
deconstruct
迁移的方法。如果您以后需要修改这样的子类,那将会很复杂。由于 migrations on a custom field,它永远不会被删除、重命名等。 .另一方面,如果您直接通过函数创建 ForeignKey 的简单实例,则可以忽略所有有关迁移的内容。编辑
或者 您可以创建一个 abstract base model使用该字段并通过继承或 multiple inheritance 创建新模型:
class WithPanBasTimeUnit(models.Model):
machine_unit = models.ForeignKey(
'panbas.PanBasTimeUnit',
models.DO_NOTHING,
verbose_name=_('Machine Unit'),
related_name='%(app_label)s_%(class)s_related'
)
class Meta:
abstract = True
class ExampleModel(WithPanBasTimeUnit, ...or more possible base models...):
... other fields
如果您想向具有该字段的模型添加方法或将更多字段添加在一起,则此解决方案(受无效解决方案 Ykh 的启发)很有用,否则原始解决方案更容易。
关于django - 自定义django外域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44836369/