2015-07-28 9 views
11

Ich möchte in der Lage sein, ein UUID auf dem Client zu erstellen und an Django Erholung Rahmen (DRF) und verwende, die für die schicken Primary Key des Modells.erstellen UUID auf dem Client und Primärschlüssel mit Django REST-Framework speichern und mit einem POST

Bisher wenn ich die Primary Key senden, die id in meinem Quellcode markiert ist, ignoriert DRF die id und verwendet das Standardargument des Modells einen frischen UUID zu erzeugen.

Allerdings, wenn ich aus dem Modell zu testen, die normale Django ORM mit dem Objekt zu erstellen, und voreingestellter die UUID akzeptiert das Modell der UUID wie es Primary Key ist und versucht nicht, und eine neue zu erstellen.

Ist das möglich?

Mein Stack ist

  • Django 1.8

  • Django Rastrahmen 3,1

Hier ist der Code ist.

serializers.py:

class PersonCreateSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Person 
     fields = ('id', 'username', 'email', 'password') 

models.py:

from django.contrib.auth.models import AbstractUser 

class BaseModel(models.Model): 
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 

class Person(AbstractUser, BaseModel): 
+1

Ich habe eine ähnliche Frage und kommentierte auf github (als Referenz) https://github.com/tomchristie/django-rest-framework/issues/2432 –

Antwort

7

id Das Feld des Serializer wird als read-only wegen der editable=False Arguments.

Modell Felder, die bearbeitet werden = False gesetzt haben, und Autofield Felder gesetzt werden, um read-only standardmäßig

Versuchen Sie es ausdrücklich erklärt:

class PersonCreateSerializer(serializers.ModelSerializer): 
    # Explicit declaration sets the field to be `read_only=False` 
    id = serializers.UUIDField() 

    class Meta: 
     model = Person 
     fields = ('id', 'username', 'email', 'password') 
+0

Danke Mark. Klappt wunderbar! –

+1

abgeordnet. Beachten Sie auch, dass Sie das 'read_only = False' löschen können, wenn Sie es explizit deklarieren, da das Schlüsselwort' read_only' standardmäßig 'False' ist. –

Verwandte Themen