[英]Obtaining values from a foreign key Python model
假设我有这些模型/类:
class User(models.Model):
id = models.AutoField. . .
group = models.ForeignKey(
Group,
. . .
)
. . .
class Group(models.Model):
id = models.AutoField. . .
name = models.CharField. . .
. . .
在进行更改时调用的自定义日志记录 function 中,我这样做:
obj = # object/model being updated; in this case: User
old_values = {}
new_values = {}
for i in range(len(form.changed_data)):
vname = obj._meta.get_field(form.changed_data[i]).verbose_name
old_values.update(
{ vname: form[form.changed_data[i]].initial }
)
new_values.update(
{ vname: form.cleaned_data[form.changed_data[i]] }
)
这导致了这个 output:
old_values = {'Group': 2}
new_values = {'Group': <Group: New Group Name>}
看起来form.initial
使用id
而form.cleaned_data
使用某种难看的 object 名称格式。
两者都不需要。 我希望 output 看起来像这样:
old_values = {'Group': 'Old Group Name'}
new_values = {'Group': 'New Group Name'}
我该怎么做呢? 我无法显式导入 model 名称并使用它。 User
和Group
只是在此通用日志记录 function 中必须非显式处理的数十个模型中的两个。
我已经尝试过apps.get_model()
、 get_object_or_404()
和其他方法,但到目前为止没有任何效果。
Foreign Key默认形式的值为model的PK。
# old_values = {'Group': 2}
group = Group.objects.get(pk=old_values['Group'])
new_values = {'Group': group.name}
我仍然不知道如何做我上面尝试过的事情,但我用另一种方式解决了我的问题。
首先,每个 object 都有一个引用其 object class 的元变量。使用它,我们可以获得任何给定 object 的字段列表。
for field in obj._meta.get_fields():
value = getattr(obj, field.name, None)
您可以检查每个字段的任何规范,例如它们是否应该像 ID 字段一样被忽略,是否应该像密码字段一样被审查,或者是 ManyToManyField 等。
if isinstance(field, ManyToManyField):
values = []
for obj in value.all():
values.append(str(obj))
根据值是什么,您可能需要repr(value)
、 str(value)
、 str(object)
或只是简单的value
。
我所做的是创建一个 function get_values(object),它利用上面的方法返回一个标准化的东西列表。 在记录过程中发送 function 对象工作得很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.