django - 自定义django外域

标签 django django-models

任何人都知道如何创建外键字段并使其始终指向相同的模型,到目前为止我得到了这些。

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/

相关文章:

python - 在django模型中默认输入本地时间的当前日期时间

django - 使用用户 ID 保存模型表单?

Django测验应用程序,REST,如何设计模型?

django - 如何在Django Haystack中查询空的MultiValueField结果

python - OSError - Errno 13 权限被拒绝

python - 是否可以使用 AJAX 更改查询集?

python - 如何在 Django 上区分管理员和客户的用户(模型)

Django 测试 : URL mapping to the Class Based View

python - 如何在 django 应用程序中访问通过 AJAX 传递的 JSON 数据?

python - Django 模型,其中字段基于另一个字段,除非另有说明