2016-10-15 112 views
0

型號:嵌套對象DRF保存

class Owner(models.Model): 
    name = models.CharField(max_length=255) 

    def __unicode__(self): 
     return self.name 

class SomeThing(models.Model): 
    own_id = models.IntegerField(unique=True) 
    description = models.CharField(max_length=255, blank=True) 
    owner = models.ForeignKey(Owner, blank=True, null=True) 

def __unicode__(self): 
    return self.description 

串行器:

class OwnerNameField(serializers.RelatedField): 
    def to_internal_value(self, data): 
     pass 

    def to_representation(self, value): 
     return value.name 

    def get_queryset(self): 
     queryset = self.queryset 
     if isinstance(queryset, (QuerySet, Manager)): 
      queryset = queryset.all() 
     lista = [Owner(name="------------")] 
     lista.extend(queryset) 
     return lista 

class OwnerSerializer(serializers.HyperlinkedModelSerializer): 
    class Meta: 
     model = Owner 
     fields = ('name', 'id') 

class ThingSerializer(serializers.ModelSerializer): 
    owner = OwnerNameField(queryset=Owner.objects.all()) 

    class Meta: 
     model = SomeThing 
     fields = ('own_id', 'description', 'owner') 

基本上它按預期工作。但是當我添加一些字段所有者類我想看到所有這些領域的輸出ThingSerializer(並能夠解析它們 - 字符串不適合在這裏)。我可以更改字段所有者owner = OwnerSerializer(),這給我我需要的東西。但是當我想添加SomeThing對象(在API瀏覽器中測試)我還需要添加新的所有者對象 - 我不想要它,我想使用現有的所有者對象。我怎樣才能實現它?

+2

您需要重寫'ThingSerializer'中的'.create'或/和'.update'方法,[查看DRF文檔](http://www.django-rest-framework.org/api-guide/serializers /#可寫嵌套表示) – devxplorer

+0

DRF不會自動爲您處理。正如Wonder說的,覆蓋你的序列化程序的創建/更新方法。 –

+0

是的,這部分工作,因爲我希望它(我可以做任何我想在這些方法)。但它不會替換DRF瀏覽器內置POST表單中的字段 - 我仍然擁有Owner's * name *字段,而不是所有者的下拉列表。 – MoonWolf

回答

0

終於我明白了。 This問題描述了我的問題,並提供答案作爲魅力!