【问题标题】:How can I use a SQL nextval function in a Django insert - Custom Model Field?如何在 Django 插入 - 自定义模型字段中使用 SQL nextval 函数?
【发布时间】:2014-03-16 15:44:54
【问题描述】:

我正在尝试编写一个模型字段,当在模型插入上调用它时会发出一个nextval("my_seq"),这样 django 发出的查询结果类似于:

INSERT INTO app_table (a, b) VALUES ("something", nextval("my_seq"));

到目前为止,我已经想出了一个字段,我覆盖 get_db_prep_value 并使其在插入对象时返回 nextval 字符串,但它会被引用。

如何绕过引用的值?

这就是我在该领域所拥有的:

class MyField(models.Field):
    def __init__(self, *args, **kwargs):
        self.obj = None
        super(MyField, self).__init__(*args, **kwargs
    def contribute_to_class(self, cls, name):
        super(myField, self).contribute_to_class(cls, name)
        setattr(cls, self.name, self)
    def __get__(self, obj, tp = None):
        if obj is None:
            raise AttributeError('Can only be accessed via instance')
        self.obj = obj
        return obj.__dict__[self.name]
    def __set__(self, obj, value):
        obj.__dict__[self.value] = self.to_python(value)
    def db_type(self, connection):
        return 'varchar(25)'
    def get_db_prep_value(self, value, connection, prepared = False):
        value = super(MyField, self).get_db_prep_value(value, connection, prepared)

        if self.obj is not None and self.obj.id is None:
            if self.obj.flag:
                value = '( "XXX" || nextval("my_seq") )'
        return value
    def to_python(self, value):
        if isinstance(value, six.string_types) or value is None:
            return value
        return smart_text(value)
    def get_prep_value(self, value):
        return self.to_python(value)

【问题讨论】:

    标签: sql django postgresql


    【解决方案1】:

    我不确定您所做的是否是最佳的 Django 实践,但这里是您可以使用 nextval 的方法。

    添加到您的模型

        def get_placeholder(self, value, connection):
                return 'nextval("%s")'
    

    也可以考虑使用 SubfieldBase

    在 Django 1.5+ 中

    class MyField(models.Field, metaclass=models.SubfieldBase):
    

    The SubfieldBase metaclass

    在 Django 中

    __metaclass__ = models.SubfieldBase
    

    Writing a custom field in Django

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-17
      • 2015-10-11
      • 1970-01-01
      • 2011-09-28
      • 2019-03-16
      • 1970-01-01
      • 2021-04-15
      相关资源
      最近更新 更多