2016-08-25 5 views
0

У меня есть небольшая проблема с фреймворком django rest об общем отношении, которое также используется в единственном ограничении unique_together.django rest framework: contenttype unique_together и сериализация

У меня есть эта модель:

class VPC(models.Model): 
    name = models.SlugField(null=False, max_length=100) 
    deletable = models.BooleanField(null=False, default=True) 
    date_created = models.DateTimeField(auto_now_add=True) 
    date_modified = models.DateTimeField(auto_now=True) 
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) 
    object_id = models.PositiveIntegerField() 
    content_object = GenericForeignKey('content_type', 'object_id') 

    class Meta: 
     unique_together = (('name', 'content_type', 'object_id')) 

Он имеет общую связь и ограничение уникальности: название VPC + родового соотношения (который является владельцем).

Вот сериализатору:

class VPCSerializer(serializers.ModelSerializer): 

class Meta: 
    model = VPC 
    read_only_fields = ('deletable', 'date_created', 'date_modified') 
    fields = ('name', 'deletable') 
    lookup_field = 'name' 
    validators = [ 
     UniqueTogetherValidator(
      queryset=VPC.objects.all(), 
      fields=('name', 'content_type', 'object_id') 
     ) 
    ] 

В полях я не поставил CONTENT_TYPE и object_id как я не хочу, чтобы они отображались/компл пользователями.

Но я должен поместить их в UniqueTogetherValidator, чтобы избежать возникшей ошибки django.db.utils.integrityerror при создании VPC с той же учетной записью/именем.

Но теперь, когда я пытаюсь создать VPC я получил эту ошибку:

{ "object_id": [ "Это поле является обязательным"], "content_type": [ "Это поле обязательно для заполнения. «]}

Так что в моем viewsets.ModelViewSet Я попытался переопределить perform_create() для установки object_id и content_type номе t это выглядит так, что ошибка возникает перед вызовом этого метода.

Я также пытаюсь переопределить get_serializer_context(), чтобы вернуть словарь, содержащий объекты object_id и content_type, но это не сработает.

Я потратил много времени на это, и я не узнал. Итак, какой метод я должен переопределить, чтобы иметь возможность устанавливать object_id и content_type в сериализаторе?

Спасибо.

ответ

0

Проверка сериализатору происходит в методе

def create(self, request, *args, **kwargs): 

не в «perform_create»

вам нужно переопределить метод «создать» и заполнить «CONTENT_TYPE», «object_id» к данным запроса (который будет использоваться для инициализации сериализатора и проверки).

вы можете сделать, как, например,

def create(self, request, *args, **kwargs): 
    if hasattr(request.data, '_mutable'): 
     request.data._mutable = True 
    request.data['content_type'] = "your_content_type" 
    request.data['content_type'] = "your_object_id" 

    serializer = VPCSerializer(data=request.data, request=request) 
    serializer.is_valid(raise_exception=True) 
    self.perform_create(serializer) 

    return Response here.. 

Просто заполните необходимые данные, прежде чем инициализировать сериалайзер и проверить для проверки затем сохранить с помощью объекта сериализатора и вернуть serilizer.data или любой пользовательский ответ вы хотеть.

+0

Большое спасибо, это работает! (NB: добавьте content_type и object_id в атрибут полей для сериализатора) – JonDeau

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