从外键Python模型获取值



假设我有这些模型/类:

class User(models.Model):
id = models.AutoField. . .
group = models.ForeignKey(
Group,
. . .
)
. . .
class Group(models.Model):
id = models.AutoField. . .
name = models.CharField. . .
. . .

在进行更改时调用的自定义日志函数中,我这样做:

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]] }
)

输出如下:

old_values = {'Group': 2}
new_values = {'Group': <Group: New Group Name>}

看起来像form.initial使用了id,而form.cleaned_data使用了某种不美观的对象名称格式。

都不需要。我希望输出看起来像这样:

old_values = {'Group': 'Old Group Name'}
new_values = {'Group': 'New Group Name'}

我该怎么做?我不能显式导入模型名并使用它。UserGroup仅仅是这个通用日志函数中必须非显式处理的几十个模型中的两个。

我试过apps.get_model()get_object_or_404()和其他方法,但到目前为止,没有任何方法对我有效。

默认形式的Foreign Key值为模型的PK。

# old_values = {'Group': 2}
group = Group.objects.get(pk=old_values['Group'])
new_values = {'Group': group.name}

我还是不知道怎么做我上面尝试过,但我解决了我的问题的另一种方法。

首先,每个对象都有一个引用其对象类的元变量。使用它,我们可以获得任何给定对象的字段列表。

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

我所做的是创建一个函数get_values(object),它利用上面的方法返回一个标准化的列表。在日志记录过程中向对象发送该函数工作得很好。

最新更新