【问题标题】:Accessing models by variable model name in django在 django 中通过变量模型名称访问模型
【发布时间】:2016-04-14 18:10:19
【问题描述】:

我有两个相同的模型,比如 django 中的 X 和 Y:

class X(models.Model):
    con = models.CharField(max_length=100)
    a = models.ForeignField("FOO")

class Y(models.Model):
    con = models.CharField(max_length=100)
    b = models.ForeignField("BAR")

要访问这些模型的对象,我必须使用以下代码:

models.X.objects.get(
    con = "something",
    a = xy
)

models.Y.objects.get(
    con = "something",
    b = yx
)

有没有办法将模型名称设置为变量,例如model_name = X,然后使用此代码访问对象:

models.model_name.objects.get(**my_dict)

在哪里

my_dict = {"con":"something", "a":xy}

【问题讨论】:

  • 如果您有两个相同的模型,您的数据库架构可能有问题,您应该将模型名称移动到表字段中。
  • 该应用需要两个模型,因为我需要两个不同的外键以及其他相似但可能包含不同值的字段。

标签: python django


【解决方案1】:

你可以这样做:

getattr(models, model_name).objects.get(**my_dict)

它允许您通过字符串或变量访问models 的属性。

【讨论】:

  • 所以基本上,我应该做的是getattr(models, X).objects.get(**my_dict)?
  • 不,X 应该写成字符串。所以你写getattr(models, 'X').objects.get(**my_dict)
【解决方案2】:

你当然可以:

setattr(models, 'model_name', models.X)

这会将model_name 属性设置为models.X(或models.Y),这将使您的调用models.model_name.objects.get(**my_dict) 成功。

或者,您可以在开始工作之前将要使用的模型保存在一个变量中,然后再使用它:

model_name = models.X
model_name.objects.get(**my_dict)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 2019-08-27
    • 2019-09-30
    • 2017-12-25
    • 2019-01-14
    • 2011-01-05
    • 1970-01-01
    相关资源
    最近更新 更多