2015-03-25 29 views
8

Benengelle Django DİNLENME çerçevesinde hatayı "alanı benzersiz olmalıdır"

class MyModel(models.Model): 
    uuid = models.CharField(max_length=40, unique=True) 

ve

class MyModelSerializer(serializers.ModelSerializer):  
    class Meta: 
     model = MyModel 
    fields = ('uuid') 

Ve MyModel nesne ile JSON almak istediğiniz bir serileştiriciden ama olabilir gibi bir modeli mevcut nesneler. Ben nesne mevcut ilgili verileri içeren serializer.is_valid() kullandığınızda Yani, bana bir hata verir:

for record in request['records']: 
    # request - body of JSON request, 
    # 'records' - array of records I want to add or update 

    serializer = MyModelSerializer(data=record) 
    if serializer.is_valid(): 
     # Do stuff 
     serializer.save() 

Hata:

{"uuid":["This field must be unique."]} 

yeni ve mevcut nesneler için davranışını ayırmak için bir yolu var mı? Özellikle, henüz veritabanı değilse ve mevcut MyModel nesnesini güncelse yeni MyModel nesnesini oluşturmak istiyorum.

+0

genellikle size serileştiriciye ile çalışmak için kullandığınız kod (ekleyebilir soru) –

+0

Eklendi, ancak işe yaramaz bir bilgi çünkü zaten tanımladım - sorun is_valid() işlevi. –

+0

Tam API görüntüleme kodunuzu ekleyebilir misiniz? Belki de bir örnek oluşturmak ve güncellemek için bir POST isteği kullanıyorsunuz? – Fiver

cevap

2

Temel olarak, yeni örnekler oluşturmaya ve POST isteğini kullanarak varolan örnekleri güncellemeye çalışarak REST API'nızın tek bir giriş noktasını aşırı yüklüyorsunuz. Ayrıca, aynı anda bir tek POST isteğinde birden çok örneği oluşturmaya ve güncelleştirmeye çalışıyorsunuz.

Django REST Framework (DRF) bir POST isteğinin yalnızca yeni örnekler oluşturmasını bekler. Bu nedenle, varolan bir örnek kaydın gönderilmesi, uuid alanı için benzersiz bir kısıtlama ihlali tetikler çünkü DRF bu örneği varolan uuid değerine sahip olduğundan yeni bir örnek olarak oluşturmaya çalışır.

REST API'nizi daha "RESTful" yapmak için bir çözüm, kayıtların oluşturulmasını ve güncelleştirilmesini sırasıyla POST ve PUT isteklerine ayırmak olacaktır. generic API views provided by DRF kullanıyor, ancak CreateAPIView POST yeni örneklerini kullanabilirsiniz, sonra da PUT ve/veya varolan örneklerini ayrı bir UpdateAPIView oluşturun. Daha da iyisi, ListCreateAPIView ve RetrieveUpdateAPIView genel görünümlerini kullanarak bu son noktaların her ikisi için de GET aracılığıyla erişime izin verebilirsiniz. Son olarak, toplu istekleri (örneğin, tek bir istekte birden çok örneği) ele almak için yerleşik görünüm yöntemlerini geçersiz kılabilir veya django-rest-framework-bulk gibi bir üçüncü taraf paketini kullanabilirsiniz.

2

Son nokta üstündeki 2 düzey hiyerarşisi ile derin bir oluşturma yönteminin olduğu bir durum vardı, tüm modellerin idempotent olması önemliydi.

Diziselleştiricideki doğrulamayı geçersiz kıldım ve el ile oluşturdum.

Size (Aksi doğrulayıcı çalıştırmak edilmeyecektir) üstündeki sınıfına alan eklemek önemlidir

class ParticipantSerializer(serializers.HyperlinkedModelSerializer): 

    device = DeviceSerializer(required=False) 
    uuid = serializers.CharField() 

    def validate_uuid(self, value): 
     if value is not None and isinstance(value, basestring) and len(value) < 256: 
      return value 
     else: 
      if value is not None: 
       raise serializers.ValidationError("UUID can't be none") 
      elif isinstance(value, basestring): 
       raise serializers.ValidationError("UUID must be a string") 
      elif len(value) < 256: 
       raise serializers.ValidationError("UUID must be below 256 characters") 
      else: 
       raise serializers.ValidationError("UUID has failed validation") 

    class Meta: 
     model = Participant 
     fields = ("uuid", "platform", "device") 
+0

ile şeyler için önce eklenmiştir Benim için özel doğrulama yöntemi gerekli değildi. Sadece 'serializers.CharField() 'tanımlayarak sorunu çözdü. Bence bu, tamamen modelleri atlattığı için.CharField' doğrulama ve yerine 'serializers.CharField' doğrulama kullanır. 'serializers.CharField''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' dır ve varsayılan olarak doğrulayıcı içermez http://www.django-rest-framework.org/api-guide/fields/ – morningstar

İlgili konular