簡體   English   中英

如何在yaml中Django dumpdata嵌套模型

[英]how to Django dumpdata nested models in yaml

所以我有這個很棒的Django應用,它給我滿意的感覺。 但現在出現問題了,我想使用dumpdata (或執行相同操作的東西)以yaml格式導出具有嵌套的其他模型的模型。

可以說我有兩個模型, ProjectQuestions 每個Project都可以擁有自己的一組Questions

代碼看起來像這樣:

項目模型:

class Projects(SortableMixin):
    """
    Some docstring
    """
    slug = models.SlugField(
            _('slug'),
            help_text=_('Short name to address this projects from templates.'))
    # Basic fields
    object_id = models.PositiveIntegerField(blank=True, null=True)
    name = models.TextField(_('name'), help_text=_('The question.'))
    # Some other fields...
    question = models.ForeignKey(Question, null=True, blank=True)

問題模型:

class Question(SortableMixin):
    """
    Some docstring
    """
    slug = models.SlugField(
        _('slug'),
        help_text=_('Short name to address this question from templates.'))
    # Basic fields
    object_id = models.PositiveIntegerField(blank=True, null=True)
    name = models.TextField(_('name'), help_text=_('The question.'))
    input = models.TextField()

Project模型有自己的應用程序,而Questions 結構如下:

- Django
  - Apps
    - Project
    - Questions

每當我要導出數據庫時,我都會執行以下操作:

./manage.py dumpdata --indent 4 --format yaml > dbdump.yaml

盡管這可行,並且以后可以使用LoadData導入它,但它不是我想要的,但是yaml文件的輸出看起來很糟糕。 我想要一個漂亮的嵌套模型外觀yaml文件,以供查看,位於the腳的外觀文件下方:

項目部分:

-   model: project.projects
    pk: 1
    fields: {slug: "slugproject1", object_id: 10, name: "some project 1", question: ["slugquestion1"]}
-   model: project.projects
    pk: 2
    fields: {slug: "slugproject2", object_id: 11, name: "some project 2", question: ["slugquestion2"]}
-   model: project.projects
    pk: 3
    fields: {slug: "slugproject3", object_id: 12, name: "some project 3", question: ["slugquestion3"]}

問題部分:

-   model: question.question
    pk: 1
    fields: {slug: "slugquestion1", object_id: 100, name: "some question 1", input: "q1"}
-   model: question.question
    pk: 1
    fields: {slug: "slugquestion2", object_id: 200, name: "some question 2", input: "q2"}
-   model: question.question
    pk: 1
    fields: {slug: "slugquestion3", object_id: 300, name: "some question 3", input: "q3"}

我真正想要的是像這樣導出yaml文件:

-   model: project.projects
    pk: 1
    fields: {
        slug: "slugproject1", 
        object_id: 10, 
        name: "some project 1", 
        questions: {
            model: question.question
            pk: 1
            fields: {
                 slug: "slugquestion1"
                 object_id: 100
                 name: "some question 1"
                 input: "q1"
            }            
        }
    }
-   model: project.projects
    pk: 2
    fields: {
        slug: "slugproject2", 
        object_id: 11, 
        name: "some project 2", 
        questions: {
            model: question.question
            pk: 2
            fields: {
                 slug: "slugquestion2"
                 object_id: 200
                 name: "some question 2"
                 input: "q2"
            }            
        }
    }
-   model: project.projects
    pk: 3
    fields: {
        slug: "slugproject3", 
        object_id: 13, 
        name: "some project 3", 
        questions: {
            model: question.question
            pk: 3
            fields: {
                 slug: "slugquestion3"
                 object_id: 300
                 name: "some question 3"
                 input: "q3"
            }            
        }
    }

為此,我在項目內部實現了自定義序列化程序:

- Django
  - Apps
    - Project
      - Management
        - Commands
          - test.py
    - Questions

代碼如下:

from django.core.management.base import BaseCommand, CommandError
from apps.project import Projects
from apps.questions import Question
from rest_framework import serializers
import yaml


class QuestionSerialier(serializers.ModelSerializer):
    class Meta:
        model = Question
        fields = ('pk', 'slug', 'object_id', 'name', 'input')


class ProjectsSerializer(serializers.ModelSerializer):
    questions = QuestionSerialier(many=True, read_only=True)

    class Meta:
        model = Projects
        fields = ('pk', 'slug','object_id', 'name', 'questions')


class Command(BaseCommand):
    help = ''

    def add_arguments(self, parser):
        pass

    def handle(self, *args, **options):

        with open('result.yaml', 'w') as yaml_file:
            for i in Projects.objects.filter():
                yaml.dump(ProjectsSerializer(i).data, 
                                yaml_file,
                                default_flow_style=False,
                                allow_unicode=False,
                                encoding=None)

我可以通過運行以下代碼來運行代碼:

./manage.py test

只有這樣才能導出我的模型,如下所示:

- project: 1
  pk: 1
  slug: "slugproject1"
  object_id: 10
  name: "some project 1"
  questions:
  - !!python/object/apply:collections.OrderedDict
    - - - pk
      - - slug
      - - object_id
      - - name
      - - input
- project: 2
  pk: 2
  slug: "slugproject2"
  object_id: 11
  name: "some project 2"
  questions:
  - !!python/object/apply:collections.OrderedDict
    - - - pk
      - - slug
      - - object_id
      - - name
      - - input
- project: 3
  pk: 3
  slug: "slugproject3"
  object_id: 12
  name: "some project 3"
  questions:
  - !!python/object/apply:collections.OrderedDict
    - - - pk
      - - slug
      - - object_id
      - - name
      - - input

如您所見,以上內容不適用於導入甚至可讀的導出...

你們能為我指出如何在Django中實現嵌套模型dumpdata yaml導出的正確方向嗎?

謝謝!

所以我想出了如何處理出口/進口。

要導出為適當的yaml文件格式,我執行了以下操作:

...
class Command(BaseCommand):

def handle(self, *args, **options):
    with open('result.yaml', 'w') as yaml_file:
        model = serializer.Meta.model
        json_object = []
        json_data = json.dumps(serializer(model_data).data)
        json_object.append(json.loads(json_data))

        yaml.dump(
            json_object,
            yaml_file,
            default_flow_style=False,
            allow_unicode=False,
            encoding=None
        )

這將導出到正確的yaml文件。

然后,要導入yaml文件,請執行以下操作:

...
class Command(BaseCommand):
    def handle(self, *args, **options):
        with open('result.yaml', 'r') as yaml_file:
            yaml_list = yaml.load(yaml_file.read())
            for data in yaml_list:
                ...process file

就是這樣!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM