【发布时间】: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