2016-10-10 188 views
3

我無法從串行器中檢索所需的所有字段。 場景:Django Rest框架 - M2M通過

我有2個表:項目&倉庫。這些表通過名爲InventoryStatus的表通過M2M關係連接。我需要的是從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) 

串行:

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

,你會得到什麼樣的智慧你的序列號?沒有「狀態」字段的所有內容? –

+0

是...當我用 庫存= InventoryStatusSerializer(多=真) 我得到CompanyBranch ID代替ID已從InventoryStatus表...即使當我有InventoryStatus觀點......在InventoryStatus視圖我可以得到場像從任何其他表...但我不能將此結果嵌入到項目的結果 –

回答

0

您需要的字段部分添加到串行器類,如下列:

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

您還需要爲別人做同樣的。

2

的問題是,M2M關係直接給相關對象,而不對「通過」表中的任何信息,使其成爲一個痛苦的時候,你要序列搶在「通過」表中的一些信息。爲了解決這個問題,我通常使用「through」關係來獲取「through」表和相關項目的信息。

在你的情況下,它可能看起來像:

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')