繁体   English   中英

修改django相关对象的默认“ _id”后缀

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM