2009-07-16 20 views
8

benim Django modeli tefrika ettik:Django Model seri kaldırma

serializers.serialize(MyModel.objects.filter(color="Red")) 

ve bu çıktıyı var: Yani

<object model="example.example" pk="133"> 
    <field name="name" type="CharField">John Smith</field> 
    <field name="color" type="CharField">Red</field> 
    ... #more fields 
</object> 

Eğer pk = "133" Ben görebilirsiniz:

Ve şimdi bunu tekrar django modeline dönüştürmek istiyorum ve() veritabanına kaydedin ama farklı pk ile yeni kimlik ile yeni kayıt oluşturmalı. Ben kullanarak XML ve değişim pk ayrıştırmak çalışıyorum

:

  • pk = "1" veya "0" - - aslında yaratır "- ayrıştırıcı pk
  • pk = tam sayı olması gerektiğini şikayet" ile rekor id/pk = "1" veya "0"
  • pk = "Yok" veya Hiçbiri ya da "boş" - çözümleyici bu özellik zorunludur şikayetçi - çözümleyici o pk niteliği "pk"
  • kaldır tamsayı olmalıdır şikayet

Django Serialization makalesinde, JSON'dan null "pk" ile nasıl deserialize edileceğine dair bir örnek var.

# You can easily create new objects by deserializing data with an empty PK 
# (It's easier to demo this with JSON...) 
>>> new_author_json = '[{"pk": null, "model": "serializers.author", "fields": {"name": "Bill"}}]' 
>>> for obj in serializers.deserialize("json", new_author_json): 
...  obj.save() 

(O 0.96 aslında, ama o 1 için çalışması gerektiğini sanıyorum * da)

Yani JSON pk null olabilir ama XML o şikayet ediyor. XML için null null nasıl ayarlanır?

Teşekkürler

+0

Evet, bu django'daki bir hatadır, bkz. Http://code.djangoproject.com/ticket/11486 – pihentagy

cevap

5

Django'da hataya benziyor. XML seri hale getirilmiş nesne için boş (veya sıfır/Yok) "pk" sağlamanın bir yolu yoktur. Django/çekirdek/serileştiricileri/xml_serializer.py itibaren

:

class Deserializer(base.Deserializer): 
    ... 
    def _handle_object(self, node): 
    ... 
     pk = node.getAttribute("pk") 
     if not pk: 
      raise base.DeserializationError("<object> node is missing the 'pk' attribute") 

     data = {Model._meta.pk.attname : Model._meta.pk.to_python(pk)} 
    ... 

pk nitelik eksikse - özel durumu oluşturuldu. Yani biraz pk sağlamak zorundayız. Django/modeller/tarlalarýndan

/init .py

class AutoField(Field): 
    ... 
    def to_python(self, value): 
     if value is None: 
      return value 
     try: 
      return int(value) 
     except (TypeError, ValueError): 
      raise exceptions.ValidationError(
       _("This value must be an integer.")) 
    ... 

pk tamsayı değilse - Ayrıca istisna.

Boş pk sağlamanın bir yolu yok gibi görünüyor.

Geçici çözüm olabilir:

  1. serisi kaldırılmaya tasarruf modeli
  2. yeni kimliği ile benim xml MyModel dan
  3. id + = 1
  4. set "pk" azami kimliği almak (

Bu biraz zor çünkü adımlar 1-5 sırasında tablo kilitli .. bir şekilde .. sadece id çarpışma önlemek için.

DÜZENLEME:

Geçici çözüm ise:

  1. Seti pk = "999999" (bazı geçici tamsayı değeri)
  2. yineleme kümesi id Sırasında ve pk kaydetmek sonradan Yok olarak ve()

    mymodels_iterator = serializers.deserialize ("xml", fixed_pk_serialized_xml_model)

    mymodels_iterator içinde mymodel için

    :

    mymodel.object.id = None 
    mymodel.object.pk = None 
    mymodel.save() 
    

Ve işe yarıyor!

Evgeny'nin clone() yöntemi hakkındaki yorumu için teşekkür ederiz.

+1

sadece bir düşüncedir - eğer ayrıştırıcı doğrulanıyorsa, geçersiz bir değer atamanıza izin vermez. ayrıca - birincil anahtarınız otomatik artırılıyor mu? eğer o zaman muhtemelen onları manuel olarak ayarlamak istemezseniz, clone() gibi bir yöntem oluşturur veya böyle bir yöntemi arardım. – Evgeny

İlgili konular