2015-07-28 9 views
11

Chciałbym, aby móc stworzyć UUID na kliencie i wysłać go do Django Framework Rest (DRF) i użyć jej dla Primary Key modelu.Tworzenie UUID na kliencie i zapisać klucz podstawowy z Django Framework i REST za pomocą POST

Jak dotąd, kiedy wysłać Primary Key, który jest oznaczony id w moim kodu źródłowego, DRF ignoruje id i wykorzystuje domyślny argument Modelu wygenerować świeże UUID.

Jednak, kiedy testować z modelu, używając normalnego Django ORM do utworzenia obiektu i wstępnie ustawić UUID, model akceptuje UUID jak to Primary Key i nie spróbować odtworzyć nowy.

Czy to możliwe?

Moja stos jest

  • Django 1.8

  • Django Reszta Framework 3,1

Oto kod.

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

mam powiązany pytanie i skomentował github (dla odniesienia) https://github.com/tomchristie/django-rest-framework/issues/2432 –

Odpowiedz

7

id Dziedziną serializatora jest ustawiony read-only powodu editable=False argumentu.

pola model, który posiada edytowalną = False set i pola AutoField będzie być ustawione tylko do odczytu domyślnie,

Spróbuj deklarując go wyraźnie:

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

Dziękuję Mark. Działa jak marzenie! –

+1

Oddelegowany. Zauważ też, że możesz upuścić 'read_only = False' gdy deklarujesz je jawnie, ponieważ argument' read_only' jest domyślnie 'False'. –