Как вернуть json, содержащий объект модели, а также все связанные с ним модели в Django
Я работаю над проектом в django
, и я застрял, пытаясь extract
некоторые concepts
, и разобрать их rules
или complex rules
в зависимости от instance_type концепции, и rule clauses
для каждого правила, а затем поместить их в json, как формат.
Вот структура модели, чтобы дать вам краткое представление о базе данных
и вот как вкратце выглядит его реализация:
class RuleClause(models.Model):
name = models.CharField(max_length=100, null=False, default="")
type = models.CharField(max_length=200,choices=clauses_types_choices, default="StatsRuleClause")
class Rule(models.Model):
name = models.TextField(default=DEFAULT_NAME) # , unique=True)
description = models.TextField(null=True, blank=True)
clauses = models.ManyToManyField(RuleClause, through="RuleClauseRule")
class ComplexRule(models.Model):
name = models.TextField(default=DEFAULT_NAME, unique=True)
description = models.TextField(null=True, blank=True)
rules = models.ManyToManyField(Rule, through="RuleComplexRule")
class Concept(models.Model):
name = models.CharField(max_length=200, default=DEFAULT_NAME, unique=True)
instance_id = models.IntegerField(default=0)
instance_type = models.CharField(max_length=200, choices=concept_type_choices)
И вот желаемый результат:
{"concepts": [
{
"name": "Concept_1",
"instance_type": "rule"
"instance_id": {
"name": "rule_1",
"description": "",
"clauses": [
{
"name": "Clause_1",
"type": ""
},
{
"name": "Clause_2",
"type": ""
}]
}
},
{
"name": "Concept_2",
"instance_type": "complex_rule"
"instance_id": {
"name": "complex_rule_1",
"description": "",
"rules": [
{
"name": "Rule_2",
"description": "",
"clauses": [
{
"name": "clause_1",
"type": ""
},
{
"name": "clause_4",
"type": ""
}]
}]
}
}
]}
Important: Keep in mind I am also considering query optimization here. Typically by avoiding the "n+1" problème
Я пробовал несколько методов, зная, что я не должен изменять модели, я поражен их извлечением. Я попробовал несколько методов, но каждый раз получаю ошибку из-за того, как django работает со своими встроенными функциями и классами.
Например, одна из ошибок, которую я получил, пробуя один из неудачных подходов, выглядит так:
def get_instance(concept):
instance = {}
if concept['type'] == "rule":
rule = Rule.objects.get(id=concept["instance_id"])
clauses = rule.clauses.all()
rule.clauses = clauses #error in this line
instance = rule
elif concept['type'] =="rules_group":
rule_group = ComplexRule.objects.filter(id=concept["instance_id"]).select_related('rules').all()
instance = rule_group
else:
print(f"This is different I don't know this type: {concept.type} \n")
return instance
В процессе присвоения клаузул к rules.clauses.
говорится"Direct assignment to the forward side of a many-to-many set is prohibited. Use clauses.set() instead."