2017-03-05 128 views
1

更新問題Django的REST框架,並結合模型

我能得到它的工作,並已低於更新代碼。但現在我的問題是如何編輯iceinfo中的字段?現在,它以IceInfo object的形式返回,而不是作爲可編輯字段。我只能編輯ice_codeice_maker

老問題

我想爲我們的數據庫的API。數據庫中的信息被劃分爲多個表格,所有表格的主鍵都與「Ice-code」相同。

我一直在努力,現在一個星期的大部分時間將表結合起來,所以我可以從一個URL(api.something.com/ice/)能夠看到(api.something.com/ice/1)冰和一個列表就能看到詳細視圖的冰塊融合了所有表格的信息。

似乎無論我嘗試什麼,我都無法合併表格。

這是我到目前爲止的草稿。我希望能夠最終從前端更新字段。每張桌子的總行數在70-80k左右,他們有比這裏更多的列,但我只是想做一個粗略的工作草案。

#models.py

class IceInfo(models.Model): 

    ice_name = models.TextField(db_column='Ice name', blank=True, null=True) 
    updated = models.DateTimeField(db_column='Updated') 
    ice_code = models.ForeignKey(IceList, related_name='iceinfo', db_column='Ice-code', on_delete=models.CASCADE, primary_key=True) 

    class Meta: 
     managed = False 
     db_table = 'Ice_Info' 


class IceList(models.Model): 
    ice_code = models.IntegerField(primary_key=True, db_column='Ice-code', max_length=10) 
    ice_maker = models.CharField(db_column='Ice Maker', max_length=255, blank=True, null=True) 
    updated = models.DateTimeField(db_column='Updated') 
    class Meta: 
     managed = False 
     db_table = 'Ice_List' 

    def __str__(self): 
     return self.ice_code 

#serializers.py

from rest_framework import serializers 
from .models import IceList, IceInfo 



class IceInfoSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = IceInfo 
     fields = '__all__' 


class IceListSerializer(serializers.ModelSerializer): 

    iceinfo = IceInfoSerializer(many=True) 

    class Meta: 
     model = IceList 
     fields = ('ice_code', 'ice_maker', 'iceinfo') 

#的views.py

from .models import IceInfo, IceList 
from .serializers import IceListSerializer 
from rest_framework.generics import ListAPIView, RetrieveAPIView, RetrieveUpdateAPIView 
from rest_framework.filters import SearchFilter, OrderingFilter 


class IceList(ListAPIView): 
    queryset = IceList.objects.all() 
    serializer_class = IceListSerializer 
    filter_backends = [SearchFilter, OrderingFilter] 
    search_fields = ['ice_code', 'ice_maker', 'ice_name'] 

個結果

"results": [ 
     { 
     "ice_code": 1, 
     "iceinfo": [ 
     { 
      ice_name": "Ice Name 1" 
     } 
     ) 
     "ice_maker": "Ice Maker 1" 
     }, 
     { 
     "ice_code": 2, 
     "iceinfo": [ 
     { 
      ice_name": "Ice Name 2" 
     } 
     ) 
     "ice_maker": "Ice Maker 2" 

     }, 
+0

在我看來,你不需要IceListSerializer來對IceInfo的許多實例進行序列化,只需使用many = True即可。爲什麼你甚至需要IceList? –

+0

謝謝你的回覆。你能否用許多= True來詳細說明你的意思?Ice_List和Ice_Info表都包含更多列,所以這就是爲什麼使用IceList和IceInfo的原因。 – Shopro

+0

假設你的目標是序列化IceInfo的許多實例,IceList的目的是什麼?或者你在嘗試一些不同的東西?如果我是對的,你可以通過將查詢集傳遞給序列化程序,並給出關鍵字many = True。看到這裏: [文檔](http://www.django-rest-framework.org/tutorial/1-serialization/#working-with-serializers) –

回答

0

假設你的目標是串行IceInfo的很多情況下,是什麼IceList的目的是什麼?或者你在嘗試一些不同的東西? Rest框架將多個對象序列化爲列表沒有任何問題。

您可以通過將queryset傳遞給序列化程序,並給出關鍵字many = True來做到這一點。在這裏看到: documentation

結果會是這樣的 queryset = IceInfoSerializer(IceInfo.objects.all(), many=True)

關於新問題,您應該可以從查詢集編輯它們。你試過什麼了? (你可以更好地在新問題上開一個新的話題)

另外,你發佈的JSON似乎不是有效的,你可以檢查你是否複製粘貼它是否正確?