2014-02-17 2 views
1

Я создаю конечную точку api, используя django-rest-framework для конкретного входа json. У меня есть два взаимосвязанных модели, как это (давайте предположим, что пост может иметь только одну категорию):django rest framework вложенные объекты получить или создать поведение

class Category(models.Model): 
    name = models.CharField(max_length=10) 
    slug = models.SlugField() 


class Post(models.Model): 
    category = models.ForeignKey() 
    title = models.CharField(max_length=100) 
    text = models.CharField(max_length=256) 

и мой сериализатору простые модели сериализаторов:

class CategorySerializer(ModelSerializer): 
    id = serializers.IntegerField(required=True) 

    class Meta: 
     model = Category 


class PostSerializer(ModelSerializer): 
    id = serializers.IntegerField(required=True) 
    category = CategorySerializer() 

    class Meta: 
     model = Post 

и мой взгляд апи очень просто также:

class PostAPIView(mixins.CreateModelMixin, GenericAPIView): 
    serializer_class = PostSerializer 
    permission_classes = (IsAuthenticated,) 

теперь для того, чтобы создавать сообщения мне нужно, чтобы разобрать вход JSON как это:

{ 
    "id": 10, 
    "pk": 10 
    "title": "Some title", 
    "text": "Some text", 
    "category": { 
     "id": 15, 
     "pk": 15 
     "name": "Best category", 
     "slug": "best-category" 
    } 
} 

здесь параметры «pk» имеют решающее значение для меня, я хочу, чтобы данные были созданы на моем db, используя точный pk, предоставленный в json. Теперь, если я делаю почтовый запрос и нет сообщений с идентификатором: 10 и категориями с идентификатором: 15 все в порядке, а данные записываются в db, новые записи вставлены, но если они есть, когда rest-framework возвращает ошибку, например [ 'Post id 10 уже существует'], я бы хотел, чтобы соответствующие записи обновлялись в соответствии с вводом. Как я могу это сделать?

ответ

0

Вам просто нужно добавить UpdateMixin, просто импортировать его как CreateModelMixin. Этот mixin будет реализовывать методы обновления и частичного обновления, которые будут делать то, что вы хотите. Но вы не можете отправить POST, для этого вам понадобится PUT, или PATCH. Вы хотите сделать это на POST, я рекомендую вам реализовать свой собственный метод создания вида.

+1

Если я добавляю put/patch, тогда для рамки rest требуется требуемые поля look_up и модель для представления, которое я создал, и поскольку я работаю с несколькими моделями с этим вводом, я не могу их предоставить .. – balkan

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