2014-12-02 5 views
0

Я хотел бы отфильтровать сериализацию поля многого, но мне не нужно создавать представление или общий вид, как описано here, потому что мне нужно использовать данные в другом представлении.Django Rest Framework, отфильтровывающий много-много полей

Код довольно прост. местоположения в модели si многоголовое поле.

class ServiceSerializer(serializers.ModelSerializer): 
    locations = LocationSerializer(many=True) 
    # [...] 
    class Meta: 
     model = Service 

И LocationSerializer является:

class LocationSerializer(serializers.ModelSerializer): 
    # [...] 
    class Meta: 
     model = LocationAddress 
     # [...] 

Я хотел бы получить место сериализованных но только на основе булева поля в модели. active = True. Как я могу это сделать?

+0

Вы хотите сказать, что вам нужны только местоположения с активным значением = Истина для сериализации или что вы хотите, чтобы только поле активного поля было сериализовано? –

ответ

2

Если вам не нужно поле locations в сериализаторе для записи, вы можете просто перейти на SerializerMethodField. Другой вариант - динамически удалить поле locations, когда вы сериализуете отдельный объект, который будет создавать несогласованный вывод, если возвращаются несколько объектов, у которых нет одинакового флага active.

Для этого необходимо ввести новый метод ServiceSerializer.

class ServiceSerializer(serializers.ModelSerializer): 
    locations = SerializerMethodField("get_locations") 
    # [...] 
    class Meta: 
     model = Service 

    def get_locations(self, obj): 
     if obj.active: 
      return LocationSerializer(obj.locations.all(), many=True) 

     return None 

Это сделает locations только для чтения, который не может быть то, что вы надеетесь. Это также означает, что locations вернет null, когда он неактивен, и вы, возможно, хотели полностью удалить ключ.

Другой вариант - просто полностью отбросить ключ в методе to_representation (to_native в формате DRF 2.x).

class ServiceSerializer(serializers.ModelSerializer): 
    locations = LocationSerializer(many=True) 
    # [...] 
    class Meta: 
     model = Service 

    def to_representation(self, obj): 
     rep = super(ServiceSerializer, self).to_representation(obj) 

     del rep["locations"] 

     return rep 
+1

'return LocationSerializer (obj.locations.all(), many = True)' даст вам 'SerializerMethodField() не JSON serializable', поэтому вы должны использовать' LocationSerializer (obj.locations.all(), many = True). data' – user3479125

Смежные вопросы