![](/img/trans.png)
[英]django model.objects.values() return related id instead of title
[英]Modifying django's default “_id” suffix for related objects
我正在将django与旧版系统和数据库集成,并具有一个类似于以下的模型
class Label(models.Model)
iLabelID = models.IntegerField(db_column='LABELID', primary_key=True)
organization = models.OneToOneField(Organization, related_name='labels', db_column='ORGANIZATION')
sLabelText = models.CharField(max_length=42)
使用此表示法(或多或少的匈牙利表示法 )是项目的要求。
以下将在Django中工作:
>>> Label.objects.get(organization_id=1)
但是我希望能够这样写:
>>> Label.objects.get(iOrganizationID=1)
我尝试使用子类化model.OneToOneField
class MyOneToOneField(models.OneToOneField):
def get_attname(self):
# default is:
# return '%s_id' % self.name
return 'i%s%sID' % (self.name[0].upper(), self.name[1:])
但这是我在尝试使用它时遇到的错误:
>>> Label.objects.get(iOrganizationID=1)
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "django/db/models/manager.py", line 151, in get
return self.get_queryset().get(*args, **kwargs)
File "django/db/models/query.py", line 301, in get
num = len(clone)
File "django/db/models/query.py", line 77, in __len__
self._fetch_all()
File "django/db/models/query.py", line 854, in _fetch_all
self._result_cache = list(self.iterator())
File "django/db/models/query.py", line 230, in iterator
obj = model(*row_data)
File "django/db/models/base.py", line 347, in __init__
setattr(self, field.attname, val)
AttributeError: can't set attribute
编辑:这是另一个痛苦点:
我希望生成一些JSON。 该JSON将被馈送到我无法控制的系统的另一部分(无法更改名称)。 我希望我可以执行以下操作:
json.dumps(list(Label.objects.values('iLabelID', 'iOrganizationID', 'sAnotherValue')))
但这是不可能的。 我必须这样做
list(Label.objects.values('iLabelID', 'organization_id', 'sAnotherValue'))
然后手动将organization_id
映射到iOrganizationID
,尽管这对于标签ID来说不是问题。 它使代码更难以维护,阅读和执行较慢。
请注意,这不是匈牙利符号专用的,您可能需要在后缀_identifier
或_pk
或其他名称(而不是_id
。
EDIT2:我一定犯了另一个错误,因为正如lanzz指出的,get_attname确实起作用-_-
我通过对您的代码进行一些修改来解决它:
class CustomAttrNameForeignKey(djangoFields.related.ForeignKey):
def __init__(self, *args, **kwargs):
attname = kwargs.pop('attrname', None)
super(CustomAttrNameForeignKey, self).__init__(*args, **kwargs)
self.attname = attname or super(CustomAttrNameForeignKey, self).get_attname()
def get_attname(self):
return self.attname
class AModelUsingThis(djangoModels.Model):
snapshot = CustomAttrNameForeignKey(
ParentalModel, db_column="timestamp", to_field="timestamp",
attrname='timestamp', related_name="children")
在这种情况下,我们在模型中获得FK的属性,该属性完全没有后缀,但是具有给定的名称。 我尚未在DB上对其进行测试,但只是尝试使用给定的自定义FK实例化模型-效果很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.