2016-10-10 9 views
3

У меня возникли проблемы с извлечением всех полей, которые мне нужны из сериализатора. Сценарий:Django Rest Framework - M2M через

У меня есть 2 стола: & Склад. Эти таблицы связаны через отношения M2M через таблицу под названием InventoryStatus. Мне нужно, чтобы получить информацию о товаре с вложенным полем информации склада + статусом из таблицы InventoryStatus. Проблема заключается в том, я не могу получить поле "статус" ....

Модель:

class InventoryItem(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    code = models.CharField(max_length=25, null=False, blank=True) 
    orgid = models.ForeignKey('glonass.Company', null=True, related_name='inventory_items_company') 
    title = models.CharField(max_length=150, null=False, blank=True) 
    inventory = models.ManyToManyField('CompanyBranch', through='InventoryStatus', related_name='branch_iventoryStatus') 

class CompanyBranch(BaseDataDescTime, LocationInfo, PostInfo, PoboxInfo, ContactInfo): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, 
    orgid = models.ForeignKey('glonass.Company', null=True, related_name='branches') 
    slug = models.SlugField(max_length=150, blank=True, null=False) 

class InventoryStatus(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 
    inventoryitem = models.ForeignKey('InventoryItem', related_name='inventory_status_items', null=True) 
    orgid = models.ForeignKey('Company', null=True, related_name='inventory_status_company') 
    companybranch = models.ForeignKey('CompanyBranch', related_name='inventory_status_warehouses', null=True) 
    status = models.DecimalField(max_digits=9, decimal_places=2, null=True, blank=True, default=0) 

Serializer:

class InventoryStatusSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = InventoryStatus 

class CompanyBranchSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = CompanyBranch 

class InventoryItemSerializer(serializers.HyperlinkedModelSerializer): 
    inventory = CompanyBranchSerializer(many=True) 

    class Meta: 
     model = InventoryItem 

Выход Необходимый :

[ 
    { 
     'id': 'xxxxxxxxxxxxx', 
     'title': 'Car', 
     'inventory': [ 
      { 
       'id': 'yyyyyyyyyyy', 
       'title': 'warehouse 1', 
       'status': 50 
      }, 
      { 
       'id': 'zzzzzzzzzzzz', 
       'title': 'warehouse 2', 
       'status': 10 
      } 
     ] 
    } 
] 
+0

И что вы получаете остроумие h ваши сериализаторы? Все без поля «status»? –

+0

yes ... и когда я использую inventory = InventoryStatusSerializer (many = True) Я получил идентификатор CompanyBranch вместо Id из таблицы InventoryStatus ... даже если когда у меня есть представление InventoryStatus ... в представлении InventoryStatus я могу получить поля как из любой другой таблицы ... но я не могу вложить этот результат в результат Items –

ответ

0

Вам нужно добавить поля раздела к классам сериализаторы как следующее:

class CompanyBranchSerializer(serializers.HyperlinkedModelSerializer): 
     class Meta: 
     model = CompanyBranch 
     fields = = ('id', 'orgid', 'slug') 

вы также должны сделать то же самое для других.

2

Проблема заключается в том, что отношения M2M напрямую передают связанный объект без какой-либо информации о «сквозной» таблице, что делает ее болью, когда вы хотите сериализовать и получить некоторую информацию в таблице «через». Чтобы решить эту проблему, я обычно использую «сквозное» отношение для захвата информации из таблицы «через» и связанных элементов.

В вашем случае это может выглядеть примерно так:

class InventoryStatusSerializer(serializers.ModelSerializer): 
    companybranch = CompanyBranchSerializer(many=True, read_only=True) 
    class Meta: 
     model = InventoryStatus 
     fields = ('status', 'companybranch') 

class InventoryItemSerializer(serializers.ModelSerializer): 
    inventory = InventoryStatusSerializer(source='inventory_status_items', many=True, read_only=True) 

    class Meta: 
     model = InventoryItem 

Это дало бы выход, как (Примечание: Я думаю, что вы имели в виду «слизняка», а не «название» в инвентарных вашего примера):

[ 
    { 
    'id': 'xxxxxxxxxxxxx', 
    'title': 'Car', 
    'inventory': [ 
     { 
      'status': 50 
      'companybranch': { 
       'slug': 'warehouse 1', 
       'id': 'yyyyyyyyyyy',    } 
     }, 
     { 
      'status': 10 
      'companybranch': { 
       'slug': 'warehouse 2', 
       'id': 'zzzzzzzzzzzz', 
      } 
     } 
    ] 
    } 
] 

Теперь, если вы хотите, чтобы сгладить выход, просто измените InventoryStatusSerializer:

class InventoryStatusSerializer(serializers.ModelSerializer): 
    id = serializers.ReadOnlyField(source='companybranch.id') 
    slug = serializers.ReadOnlyField(source='companybranch.slug') 
    class Meta: 
     model = InventoryStatus 
     fields = ('status', 'id', 'slug')