【问题标题】:How to get the value of a Django Model Field object如何获取 Django 模型字段对象的值
【发布时间】:2019-01-25 02:32:19
【问题描述】:

我使用field_object = MyModel._meta.get_field(field_name) 获得了一个模型字段对象。如何获取字段对象的值(内容)?

【问题讨论】:

  • 你所说的字段的value是什么意思?
  • 对不起,我想我没有提出正确的问题。我的意思是我得到了一个模型实例的字段,我想要实例字段的当前内容。
  • 这样你会得到未绑定的字段。要接收值,您需要将字段绑定到实例。这通常由:MyModel.objects.get(some_query).field_name 或类似人员完成。
  • 如果您有模型实例,则不需要这些复杂性。它只是 mode_instance.field_name - 你在这里得到的是你持有的实例的那个字段的值
  • 你可以简单地通过 MyModel.objects.get(id=id).field_name 来获得价值,你不想经历所有这些复杂的事情

标签: python django django-models


【解决方案1】:

使用value_from_object:

field_name = 'name'
obj = MyModel.objects.first()
field_object = MyModel._meta.get_field(field_name)
field_value = field_object.value_from_object(obj)

getattr相同:

field_name = 'name'
obj = MyModel.objects.first()
field_object = MyModel._meta.get_field(field_name)
field_value = getattr(obj, field_object.attname)

或者如果你知道字段名,只是想使用字段名获取值,你不需要先检索字段对象:

field_name = 'name'
obj = MyModel.objects.first()
field_value = getattr(obj, field_name)

【讨论】:

  • 这里的obj 是什么?
  • obj 是一个模型实例
  • MyModel.objects.get(id=id).field 会做同样的事情
  • 否 - 如果您不知道字段名称。您应该改用getattr(MyModel.objects.get(id=id), field)(假设fieldstr)。 OP 询问如何使用字段对象检索值。这可能在这里有点矫枉过正,但只有 OP 知道实际任务。这个答案显示了如何通过字段对象从模型实例中获取字段值——就像 OP 想要的那样
  • 感谢大家抽出宝贵时间回答我的问题。我已经尝试了你所有的建议,我总是得到一个对象<django.db.models.query_utils.DeferredAttribute object at 0x10e534748>,而我正在寻找的是一个实际值,比如'Mexico'(我正在使用模型 的字段 name 进行测试>国家)。
【解决方案2】:

假设你有一个模型,

class SampleModel(models.Model):
    name = models.CharField(max_length=120)

然后你会得到模型实例的name字段的值,

sample_instance = SampleModel.objects.get(id=1)
value_of_name = sample_instance.name

【讨论】:

  • 如果 id=1 不存在,这将引发 AttributeError ......
  • 用有效的 PK 值替换 1
  • 谢谢@JPG。如果不知道自己使用的PK值是否有效怎么办...
【解决方案3】:

如果您想在模型之外的某个地方访问它,您可以在将对象设置为模型后获取它。像这样使用

模特 CLAA 之外

myModal = MyModel.objects.all()

print(myModel.field_object)

使用内部模型类
如果你在课堂上使用它,你可以像这样简单地得到它

print(self.field_object)

【讨论】:

  • 我不认为在 Model 类中使用 self 会起作用。
猜你喜欢
  • 2016-03-01
  • 2011-10-07
  • 2010-11-08
  • 2020-07-07
  • 2010-11-21
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
相关资源
最近更新 更多