【问题标题】:Foreign Key vs. Custom Field in DjangoDjango 中的外键与自定义字段
【发布时间】:2013-07-12 20:37:31
【问题描述】:

我对 Django 中的约定很好奇。我可能在这里完全偏离了轨道,但在我看来,ForeignKey 通常可以取代在 Django 中定义自己的自定义字段的需要。

例如,这就是我的代码现在的样子,

class MyObject(models.Model):
    object_type = models.ForeignKey(Object_Type)


class Object_Type(models.Model):
    value = models.CharField(max_length=20)

不能用这样的东西代替吗?

class MyObject(models.Model):
    object_type = models.CustomField()

自定义字段是我定义的一个字段,它涵盖了所有(例如 10 种) 我可能拥有的物品。 这两者之间的最佳方式是什么?

【问题讨论】:

  • 对于这个例子,我推荐ForeignKey 方法,因为你已经为你准备好了一切。
  • 假设我这样做......既然我知道我只有 10 个 object_types,我是否会用这十个值预先填充数据库而不让用户从该表中添加/删除?执行此操作的最佳方法是什么,customField 是否允许我不执行此操作?

标签: database django django-models


【解决方案1】:

是的,您可以将ForeignKey 实现为您自己的CustomField。它不会在 Django models 中(也就是说,你不能使用 models.CustomField())。你可以改用你自己的类名,它会subclassmodels.Field

尚不清楚如何处理混合类型(如 int、float 等)。您需要将它们转换为共享表示,例如字符串。

另一种选择是声明对象类并查询适当的模型。例如,如果您有:

class MyModel(models.Model):
    object_class = models.CharField(max_length=10)

class Object20(models.Model):
    mymodel = models.ForeignKey(MyModel)
    value = models.CharField(max_length=20)

那么你可以写:

m = MyModel.objects.get(pk=1)
if m.object_class == 'Object20':
    o = Object20.objects.filter(mymodel=m).get()
    value = o.value

Django 提供了contenttypes framework,但我不推荐它。单个请求可以锁定多个数据库表。但是,它解决了您描述的问题。

【讨论】:

    猜你喜欢
    • 2015-06-13
    • 2013-11-14
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多