2017-01-15 4 views
0

У меня есть три разные модели, которые я хочу собрать на странице типа канала. Они все содержат разные типы вещей, но для простоты модели в этом случае одинаковы.Django REST Framework сериализатор с различными моделями

class ObjectA(models.Model): 
    text = models.TextField() 
    pub_date = models.DateTimeField('date published',auto_now_add=True) 
    ... 

class ObjectB(models.Model): 
    text = models.TextField() 
    pub_date = models.DateTimeField('date published',auto_now_add=True) 
    ... 

class ObjectC(models.Model): 
    text = models.TextField() 
    pub_date = models.DateTimeField('date published',auto_now_add=True) 
    ... 

Что бы общая идея сериализации списки всех трех объектов в один список заказанного pub_date с использованием Django REST Framework. У меня просто есть опыт использования мета-версии ниже, но он может касаться только одной модели, которую я предполагаю. Заранее спасибо.

class ObjectAListSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = ObjectA 
     fields = [ 
      'text', 
      'pub_date' 
     ] 

Довольно много, пытаясь создать что-то, что будет работать так:

class AllObjectsListSerializer(serializers.ModelSerializer): 
+0

какой вы в конечном итоге делать? – e4c5

+0

До сих пор я пробовал версию продукта union, но я также пытаюсь экспериментировать с реструктуризацией своих моделей –

+0

, что последнее, что является лучшим вариантом. – e4c5

ответ

0

Вам нужно сделать союз на querysets:

query_union = query1 | query 2 

И вам нужен пользовательский сериализатор для поля этого союза. Или, если поля объединения все одинаковы с любой из моделей, возможно, используйте этот модельный анализатор модели, но не протестировали его.

2

Самое главное здесь, что здесь не должно быть трех разных моделей. Если они хранят одни и те же данные, должна быть только одна модель. Чтобы иметь три модели, каждый раз, когда вам нужно выполнить инструкцию, вам нужно предшествовать этому IF ELIF ELSE, который находится далеко от DRY. Не говоря уже о том, что вам нужно сделать UNION, как предложено Wtower в его answer

Объединить модели.

+0

Извините, мне следовало быть более ясным, но модели разные, я просто скопировал и вставил один и тот же один только для этого примера. –

+1

Даже если модели похожи, это означает, что у вас все еще есть проблема с вашей таблицей/моделью дизайн. – e4c5

0
dataA = ASerializer(queryset_A, many=True).data 
dataB = BSerializer(queryset_B, many=True).data 
dataC = CSerializer(queryset_C, many=True).data 

просто

обратный ответ (данные = { 'dataA': dataA 'dataB ': dataB' Datac': Datac})

Если вы хотите вернуть список, пункт это {'a': a, '' b ':' b, 'c': c}, вы должны объявить связь между a, b, c и можете фильтровать b и c с помощью a. Если так, я напишу пример для вас.