2016-03-04 58 views
1

我有两个型号:验证是从来没有发射

class Manufacturer(models.Model): 
    name = models.CharField(max_length = 100) 

class Car(models.Model): 
    manufacturer = models.ForeignKey(Manufacturer, blank = True, null = True) 

我的串行器:

class ManufacturerSerializer(serializers.ModelSerializer): 
    class Meta: 
    model = Manufacturer 
    fields = ('id', 'name') 

class CarSerializer(serializers.ModelSerializer): 
    manufacturer = Manufact 

    class Meta: 
    model = Car 
    fields = ('id', 'name', 'manufacturer') 

    def validate(self, attrs): 
    try: 
     attrs['manufacturer'] = Manufacturer.objects.get(pk = attrs['manufacturer']) 
    except Manufacturer.DoesNotExist: 
     raise ValidationError(_('Not found')) 

    return attrs 

我的观点:

class CarList(generics.ListCreateAPIView): 
    queryset = Car.objects.all() 
    serializer_class = CarSerializer 

当我尝试添加一个新的Car calling POST /cars/我得到一个验证错误manufacturer是必填字段。 Car模型预计manufacturer字段为Manufacturer对象,但为了使消息小,我将其传递给manufacturer_id

我知道应该提出一个ValidationError所以要解决这个问题我确认我是否Manufacturer通过此ID存在期间添加validate(..)CarSerializer所以,我把它分配给ATTRS。

问题是这样的validate(..)从不叫我甚至尝试添加post()方法CarList视图和手动调用is_valid()没有成功。

但我仍然得到验证错误,我认为它来自模型。

回答

1

它不起作用,因为你正在复杂的事情。 ManufacturerSerializer是没有必要的(无论如何这个观点)。 By default'manufacturer'字段将显示为PrimaryKeyRelatedField,它将自动将您的manufacturer_id解析为Manufacturer对象,因此您也不需要使用validate方法。

更新串行:

class CarPostSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Car 
     fields = ('id', 'name', 'manufacturer') 

class CarGetSerializer(CarPostSerializer): 
    manufacturer = ManufacturerSerializer() 

更新视图:

class CarList(generics.ListCreateAPIView): 
    queryset = Car.objects.all() 

    def get_serializer_class(self): 
     if self.request.method == 'POST': 
      return CarPostSerializer 
     else: 
      return CarGetSerializer 
+0

该死的,它的工作。但是,当我做'GET/cars /'请求时,我得到'manufacturer:1'而不是'manufacturer:{name:“BMW”,country:“Germany”,...}' – user1125177

+0

这是正确的。要使用不同的序列化器,请覆盖视图上的get_serializer_class方法,并检查它是GET还是POST。或者做第二个'GET/manufacturer/[pk] /'来获取细节(当然创建了这个视图之后)。 –

+0

所以我需要两个CarSerializers,一个是制造商= ManufacturerSerializer(),另一个没有这个生产线?比在视图中,我检查它是一个POST或GET并加载适当或? – user1125177