Как получить Правильный порядок в pydantic-xml?

В pydantic-xml есть возможность управлять порядком атрибутов и подэлементов при сериализации XML-документов. Для установки правильного порядка вы можете использовать атрибуты __root__ и __xml__ в модельных классах, которые вы определяете с помощью pydantic.

__root__ позволяет указать порядок подэлементов, а __xml__ - порядок атрибутов. Оба атрибута должны быть списками и содержать имена полей или имена атрибутов в нужном порядке.

Рассмотрим пример. Допустим, у вас есть класс Person с полями name, age и gender. Чтобы указать правильный порядок подэлементов, вы можете добавить __root__:

from pydantic import BaseModel

class Person(BaseModel):
    name: str
    age: int
    gender: str
    
    __root__ = ['name', 'age', 'gender']

Теперь, при сериализации экземпляра класса Person, подэлементы будут отображаться в порядке, указанном в __root__.

person = Person(name="John", age=30, gender="Male")
xml = person.xml()  # Сериализация в XML
print(xml)

Вывод:

<Person>
    <name>John</name>
    <age>30</age>
    <gender>Male</gender>
</Person>

Аналогичным образом можно установить правильный порядок атрибутов, используя атрибут __xml__. Например, если у вас есть класс Book с атрибутами title, author и year, вы можете указать порядок атрибутов следующим образом:

from pydantic import BaseModel

class Book(BaseModel):
    title: str
    author: str
    year: int
    
    __xml__ = ['title', 'author', 'year']

Теперь, атрибуты будут отображаться в XML-элементе в указанном порядке:

book = Book(title="Python in Action", author="John Smith", year=2022)
xml = book.xml()  # Сериализация в XML
print(xml)

Вывод:

<Book title="Python in Action" author="John Smith" year="2022"/>

Таким образом, использование атрибутов __root__ и __xml__ в моделях классов pydantic позволяет контролировать порядок подэлементов и атрибутов при сериализации в XML.