是否有可能创建一个Django代理字段,该字段可以访问另一个字段,但是不会为数据库保存任何内容以获取它自己的值,并且没有自己的数据库列?
对此的用例是我们想将值存储在a中JsonField,但是能够使用Django Fields的内置验证.这样做的第二个好处是能够添加新字段(具有验证功能)而不会影响数据库架构.
sudo代码可能看起来像这样:
from django.db import models
from django.contrib.postgres.fields import JsonField
class ProxyInitMixin(object):
def __init__(self, *args, *kwargs):
# some logic that will hold values if set on the Model
# but won't create a column or save anything to the
# database for this Field.
super(ProxyInitMixin, self).__init__(*args, **kwargs)
class ProxyIntegerField(ProxyInitMixin, models.Field):
pass
class ProxyCharField(ProxyInitMixin, models.Field):
pass
class MyModel(models.Model):
proxy_int = ProxyIntegerField()
proxy_char = ProxyCharField()
data = JsonField()
def save(self, *args, **kwargs):
self.data = {
'foo': self.proxy_int,
'bar': self.proxy_char
}
return super(MyModel, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
小智 1
django中有代理模型,但我不确定它是否有代理字段之类的东西。
对于您的用例,您可以执行以下操作:
`
from django.db import models
from rest_framework.fields import IntegerField, FloatField, BooleanField, DateTimeField, CharField
class MyModel(models.Model):
FIELDS = [{'field_name': 'proxy_int', 'field_type': 'int', 'null_allowed': 'True'},
{'field_name': 'proxy_char', 'field_type': 'string', 'null_allowed': 'True'}]
data = JsonField()
def field_type(self, field):
if field.field_type == 'int':
return IntegerField()
elif field.field_type == 'float':
return FloatField()
elif field.field_type == 'bool':
return BooleanField()
elif field.field_type == 'date':
return DateTimeField()
elif self.value_type == 'string':
return CharField()
return CharField()
def save(self, *args, **kwargs):
data = kwargs.get('data', {})
new_data = {}
for (field in FIELDS)
field_name = field['field_name']
field_type = field['field_type']
field_value = data.get(field_name, None)
validated_value = self.field_type(field_type).run_validation(field_value)
new_data[field_name] = validated_value
kwargs['data'] = new_data
return super(MyModel, self).save(*args, **kwargs)`
Run Code Online (Sandbox Code Playgroud)
如果需要,您可以尝试找出 django 的字段类(而不是 DRF)并使用它们进行验证。
您可以继承这个新的 MyModel 类,以在其他模型中实现类似的功能并重用代码。
| 归档时间: |
|
| 查看次数: |
1057 次 |
| 最近记录: |