Python django导入导出,导出多对多模型
我有Python django导入导出,导出多对多模型,python,django,django-import-export,Python,Django,Django Import Export,我有Rule模型,它有多个rulecondition和RuleAction。我想将这些导出到csv文件中。我使用的是django import-export 例如: name, priority, tags, conditions, actions Rule 1, 1000, "tag1,tag2", "[{"identifier":"A", "operator":"B"..}]", "[{"identifier":"A", "operator":"B"..}]" 我的模型: clas
Rule
模型,它有多个rulecondition
和RuleAction
。我想将这些导出到csv文件中。我使用的是django import-export
例如:
name, priority, tags, conditions, actions
Rule 1, 1000, "tag1,tag2", "[{"identifier":"A", "operator":"B"..}]", "[{"identifier":"A", "operator":"B"..}]"
我的模型:
class Rule(models.Model):
name = models.CharField(max_length=128, help_text="Name of Rule")
description = models.TextField(help_text="Brief Description of Rule", blank=True)
priority = models.IntegerField(default=1000, help_text="Priority of rule, lesser applies first")
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
tags = models.ManyToManyField('Tag', blank=True)
disabled = models.BooleanField(default=True)
def __str__(self):
return self.name
class RuleCondition(models.Model):
identifier = models.CharField(max_length=128, help_text="Select a Property", blank=True)
operator = models.CharField(max_length=128, help_text="Select an Operator", blank=True, choices=CONDITION_OPERATOR_CHOICES)
value = models.TextField(help_text="Content to match the rule")
rule = models.ForeignKey('Rule', on_delete=models.CASCADE, related_name='conditions')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return 'Rule Condition ' + str(self.id)
class RuleAction(models.Model):
identifier = models.CharField(max_length=128, help_text="Select a Property", blank=True)
operator = models.CharField(max_length=128, help_text="Select an Operator", blank=True, choices=ACTION_OPERATOR_CHOICES)
value = models.TextField(help_text="Content to apply on the rule")
rule = models.ForeignKey('Rule', on_delete=models.CASCADE, related_name='actions')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return 'Rule Action ' + str(self.id)
我如何才能做到这一点,在django导入导出中没有选项可以做到这一点。解决了这个问题。这是代码。覆盖django导入导出的内部功能
import json
from import_export import resources, fields
from django.core import serializers
from .models import Rule, Tag, RuleCondition, RuleAction
from import_export.widgets import JSONWidget, ManyToManyWidget, ForeignKeyWidget
class RuleOperationsWidget(ManyToManyWidget):
def render(self, value, obj=None):
return json.dumps(
list(value.values('identifier', 'operator', 'value')),
)
class RuleResource(resources.ModelResource):
tags = fields.Field(
attribute='tags',
widget=ManyToManyWidget(model=Tag, separator=',', field='name'),
)
conditions = fields.Field(
attribute='conditions',
widget=RuleOperationsWidget(model=RuleCondition),
)
actions = fields.Field(
attribute='actions',
widget=RuleOperationsWidget(model=RuleAction),
)
class Meta:
model = Rule
exclude = ('created_at', 'updated_at', 'id',)
我明白了。这是代码。覆盖django导入导出的内部功能
import json
from import_export import resources, fields
from django.core import serializers
from .models import Rule, Tag, RuleCondition, RuleAction
from import_export.widgets import JSONWidget, ManyToManyWidget, ForeignKeyWidget
class RuleOperationsWidget(ManyToManyWidget):
def render(self, value, obj=None):
return json.dumps(
list(value.values('identifier', 'operator', 'value')),
)
class RuleResource(resources.ModelResource):
tags = fields.Field(
attribute='tags',
widget=ManyToManyWidget(model=Tag, separator=',', field='name'),
)
conditions = fields.Field(
attribute='conditions',
widget=RuleOperationsWidget(model=RuleCondition),
)
actions = fields.Field(
attribute='actions',
widget=RuleOperationsWidget(model=RuleAction),
)
class Meta:
model = Rule
exclude = ('created_at', 'updated_at', 'id',)
查看此感谢@RohitSharma,但我也需要将其导入。查看此感谢@RohitSharma,但我也需要将其导入。