2016-10-28 2 views
0

Используя MongoAlchemy, возможно ли иметь DocumentField, который может быть одного из двух типов? Например:MongoAlchemy: Один из двух разных документов DocumentField

class A(Document): 
    foo = StringField() 

class B(Document): 
    bar = StringField() 

class C(Document): 
    child = DocumentField(A or B) 

Я думал несколько вариантов, которые могли бы работать:

  • Дайте A и B общий родитель, а затем сделать child = DocumentField(CommonParent).
  • Напишите пользовательский Field, который переопределяет DocumentField, но изменяет валидатор для поиска по списку типов, а не по одному.
  • Просто используйте AnythingField. Своего рода поражение.

Но интересно, было ли это уже сделано?

ответ

0

Был филиал, который я никогда не сливался (хотя я использовал его на некоторое время), где я реализовал полиморфные типы:

https://github.com/jeffjenkins/MongoAlchemy/tree/poly-queries

Если вы готовы сделать немного исправления ошибок, что это довольно хороший вариант.

В противном случае проще всего реализовать пользовательское поле. Я подозреваю, что было бы проще создать регулярное поле, в котором в качестве входных данных был бы выбран список DocumentField s, и который мог бы отличить от того, как беспорядок с DocumentField (что является чем-то вроде ветви полиморфизма, но сложнее).

+0

Спасибо за это. Пользовательское поле - это маршрут, над которым я работал. https://gist.github.com/jmgirven/59a363f9aa8392abca80fbe6956c174b. Я думаю, что wrap/unwrap работает, но из кода DocumentField я думаю, что мне нужно реализовать «dirty_ops» и «subfields» среди других вещей. Любые указатели? –

+0

Только об этом узнали сегодня, извините. Итак, если я правильно помню, грязные операторы не работают для поддокументов. Но это должно быть хорошо, если вы не пытаетесь обновлять только измененные поля (которые я бы не рекомендовал) –