Как вернуть json, содержащий объект модели, а также все связанные с ним модели в Django

Я работаю над проектом в django, и я застрял, пытаясь extract некоторые concepts, и разобрать их rules или complex rules в зависимости от instance_type концепции, и rule clauses для каждого правила, а затем поместить их в json, как формат.

Вот структура модели, чтобы дать вам краткое представление о базе данных Model's structure

и вот как вкратце выглядит его реализация:

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."

Вернуться на верх