我正在尝试使用JSONField更改EAV模型的实现,以存储由attribute_set定义的所有属性。 我已经想出了如何构建一个表单来编辑JSON的单个属性,但是我目前仍停留在实现新对象的创建上。我想我必须将对象创建分为两个步骤,因为我需要知道attribute_set才能生成正确的表单,但是我不知道是否有一种方法可以钩住create动作,或者通过其他任何方式来实现我的目标需要。
我的模型如下:
class EavAttribute(models.Model):
entity_type = models.CharField(max_length=25, choices=entity_types)
code = models.CharField(max_length=30)
name = models.CharField(max_length=50)
data_type = models.CharField(max_length=30, choices=data_types)
class AttributeSet(models.Model):
name = models.CharField(max_length=25)
attributes = models.ManyToManyField('EavAttribute')
class EntityAbstract(models.Model):
attribute_set = models.ForeignKey(
'AttributeSet',
blank=False,
null=False,
unique=False,
)
class Meta:
abstract = True
class Event(EntityAbstract):
entity_type = models.CharField(max_length=20, null=False, choices=entity_types, default=DEFAULT_ENTITY_TYPE)
code = models.CharField(max_length=25, null=True, blank=True, db_index=True)
year = models.IntegerField(db_index=True)
begin_date = models.DateField()
end_date = models.DateField()
data = JSONField()
如何首先选择AttributeSet,然后再转到另一种表单,该表单将使用所选属性集中的属性填充?
答案 0 :(得分:0)
我最终使用了get_fields()
和response_add()
方法,就像这样:
def get_fields(self, request, obj=None):
if obj is None:
return ['attribute_set']
else:
return [attr.name for attr in obj._meta.get_fields() if not attr.auto_created and attr.name != 'id']
def get_readonly_fields(self, request, obj=None):
readonly_fields = ['entity_type', 'code', 'state']
if obj is not None:
readonly_fields.append('attribute_set')
return readonly_fields
def response_add(self, request, obj, post_url_continue=None):
url = '/admin/risks/event/{}/change/'.format(obj.id)
return redirect(url)
此方法的缺点是将对象保存在数据库中,然后打开以进行编辑,因此,基本上,数据库被命中两次,并且除attribute_set之外,所有属性都必须为空。 我很高兴收到更好实施的想法。