Birincil anahtarı güncelleyin Django MySQL

fakir ingilizcem için özür dilerim, sorunum:

Django'daki PK'yi .save() yöntemiyle güncellemeye çalışıyorum, ancak Django nesnesini kaydettiğimde, aynı verilerle nesneyi çoğalttığımda, örneğin PK:

from gestion_empleados.Models import Empleados
>>> e = Empleados.objects.get(pk="56789034U")
>>> e.pk
u'56789034U'
>>> e.pk = "11111111L"
>>> e.save()
>>> e.pk
'11111111L'
>>> e2 = Empleados.objects.get(pk="56789034U")
>>> e2

>>> e

Nesneler farklı PK ile aynıdır ve nesneyi çoğaltmadan PK'yi değiştirmek istiyorum.

Herhangi bir çözüm? Teşekkürler!

4

6 cevap

Django'nun nesnenin birincil anahtarını değiştirmenize izin verdiğini sanmıyorum. Orijinal nesneyi silmek zorunda kalabilirsiniz.

e2.delete()

Django belgelerine göre

Birincil anahtar alanı salt okunur. Birincil anahtarın mevcut bir nesne üzerindeki değerini değiştirir ve sonra kaydederseniz, eskisinin yanında yeni bir nesne oluşturulur.

Django Belgeleri

6
katma
Orijinal nesneyi silmeyi düşünüyorum ama django'nun PK güncellemesine izin vermemesi garip, teşekkürler!
katma yazar avr, kaynak

Django'nun nesnenin birincil anahtarını değiştirmenize izin verdiğini sanmıyorum. Orijinal nesneyi silmek zorunda kalabilirsiniz.

e2.delete()

Django belgelerine göre

Birincil anahtar alanı salt okunur. Birincil anahtarın mevcut bir nesne üzerindeki değerini değiştirir ve sonra kaydederseniz, eskisinin yanında yeni bir nesne oluşturulur.

Django Belgeleri

6
katma
Orijinal nesneyi silmeyi düşünüyorum ama django'nun PK güncellemesine izin vermemesi garip, teşekkürler!
katma yazar avr, kaynak

Django'nun Model.save() yöntemi, bir INSERT veya UPDATE sorgu.

Daha genel bir kural olarak: Bir PK'yi SQL düzeyinde değiştirmek teknik olarak mümkün olsa da, ilgili tüm tablolardaki tüm ilgili satırları güncellemeniz gerektiği anlamına gelmesi iyi bir fikir değildir. (Tamam, hala teknik olarak mümkün ama gerçekten ilgilendiğim kadar aklı başında bir fikir değil), VE de değişikliklerin bu PK'sine bağlı olarak tüm uygulamaları uyarın - ve sonra da iyi şanslar. Uzun bir hikayeyi kısaltmak için: PK’leri değişmez olarak kabul etmek her zaman daha güvenlidir (ve bu yüzden SQL dünyasındaki pek az kişinin görünüşte açık bir doğal olanı olsa bile birincil anahtarları tercih etmesinin nedeni).

2
katma
Buradaki sorun Django'nun DB agnostik olmaya çalışması ve bu nedenle doğal bir anahtarı güncellemenin akıllıca yolu CASCADE UPDATE'i desteklememesidir.
katma yazar DylanYoung, kaynak

Django'nun Model.save() yöntemi, bir INSERT veya UPDATE sorgu.

Daha genel bir kural olarak: Bir PK'yi SQL düzeyinde değiştirmek teknik olarak mümkün olsa da, ilgili tüm tablolardaki tüm ilgili satırları güncellemeniz gerektiği anlamına gelmesi iyi bir fikir değildir. (Tamam, hala teknik olarak mümkün ama gerçekten ilgilendiğim kadar aklı başında bir fikir değil), VE de değişikliklerin bu PK'sine bağlı olarak tüm uygulamaları uyarın - ve sonra da iyi şanslar. Uzun bir hikayeyi kısaltmak için: PK’leri değişmez olarak kabul etmek her zaman daha güvenlidir (ve bu yüzden SQL dünyasındaki pek az kişinin görünüşte açık bir doğal olanı olsa bile birincil anahtarları tercih etmesinin nedeni).

2
katma
Buradaki sorun Django'nun DB agnostik olmaya çalışması ve bu nedenle doğal bir anahtarı güncellemenin akıllıca yolu CASCADE UPDATE'i desteklememesidir.
katma yazar DylanYoung, kaynak

İlk önce, "11111111L" birincil anahtarına sahip nesnenin tablonuza eklendiğinden emin olmalısınız. Muhtemelen aşağıdakiler boyunca bir şeyler yapıyor:

    
      

e3 = Empleados.objects.get (pk = "11111111L")

    
  

Ve sonra e3'ün içerdiğinden emin olun. Orada olduğunu onayladıktan sonra, "56789034U" birincil anahtarına sahip nesneden kurtulmak için aşağıdaki ifadeyi kullanabilirsiniz (e2 etrafında kaldığını varsayarak):

    
      

e2.delete()

    
  
0
katma
Ve yabancı anahtarlarınıza e2'ye işaret eden ne olur? Hata.
katma yazar DylanYoung, kaynak

İlk önce, "11111111L" birincil anahtarına sahip nesnenin tablonuza eklendiğinden emin olmalısınız. Muhtemelen aşağıdakiler boyunca bir şeyler yapıyor:

    
      

e3 = Empleados.objects.get (pk = "11111111L")

    
  

Ve sonra e3'ün içerdiğinden emin olun. Orada olduğunu onayladıktan sonra, "56789034U" birincil anahtarına sahip nesneden kurtulmak için aşağıdaki ifadeyi kullanabilirsiniz (e2 etrafında kaldığını varsayarak):

    
      

e2.delete()

    
  
0
katma
Ve yabancı anahtarlarınıza e2'ye işaret eden ne olur? Hata.
katma yazar DylanYoung, kaynak