2015-07-09 10 views
6

Belirtilen veritabanı ve model şemasıyla bulduğum belirli bir uygulama geliştiriyorum. Django sürüm 1.8.2 kullanıyorum. Aşağıda bir sorun sunulmuştur. Gereksiz alanlar atlanmış, örnek isimler için örnek isimler icat edilmemiştir çünkü açıklayamam. Bir projeyi Uzun bir süre sonra bu özel durumda aynı adı A'nın çeşitli, ancak farklı yabancı anahtar B ile olabileceğini ihtimaliniBirincil anahtar nasıl oluşturulur Django'da iki alandan oluşur?

class B (models.Model): 

     name = models.CharField(max_length=100) 

class A (models.Model): 

     name = models.CharField(max_length=100, primary_key=True) 
     related_name = models.ForeignKey(B, null=True, blank=True) 

aşağıdaki modeller A düşünün ve B., ben istiyorum İki alandan oluşan birincil anahtar "A" modeli: isim ve ilgili isim. Böyle bir anahtar nasıl oluşturulur django'da iki alandan oluşur?

+0

yerine 'id' Django varsayılan olarak' A' birincil anahtarı değiştirmek mümkün mü kullanabilir? Bu bariz düzeltme gibi görünüyor. –

+0

Merhaba :-) Cevabınız için teşekkürler. Bu iyi bir çözüm, ama benim durumumda birçok tablo bir yabancı anahtar tablosu "A" olarak var ve varsayılan kimliği değiştirmek gerçekten büyük bir çaba olacaktır. Ayrıca, 'A.objects.get (pk = "bir şey")' gibi sorguları kullanan ve birincil anahtarın türünü değiştiren çok fazla kod, çok fazla çalışma gerektirir. Bu nedenle anahtar tipini değiştirmeyen bir çözüm arıyorum. Üssün çok fazla yılı var. –

+0

Tamam. Bu durumda bunun djangoda çözülebileceğini sanmıyorum. Django, her örnek için tek ve benzersiz bir birincil anahtar gerektirir. Kompozit bir birincil anahtar kullanabilmeniz bile, pk'deki alanlardan birinin null olmayan bir yabancı anahtar olduğunda iyi bir fikir olup olmadığından emin değilim. –

cevap

3

Bileşik anahtar kullanmak istiyorsunuz. Django bu See here'u desteklemiyor. Bazı destek var ama ilişki kuramıyorsunuz, bu yüzden pratik kullanım kadar sınırlıdır.

2

Django, bileşik anahtarları desteklemez. Ama unique-together

unique_together = ("name", "related_name") 
+0

Unique_together kullanacak olursak, modellerin soruda gösterildiği gibi görüneceğini varsayardım. A unique_together = ("name", "related_name") meta-class modelinin eklenmesinin ardından, iki alan adı = "Kriss" farklı alan adıyla ilgili olabilir mi? Demek istediğim, birincil_key parametresi ad alanı true olarak ayarlanmış. –

+0

>>> s = B.objects.create (name = "JAN") >>> s.save() >>> d = A.objects.create (name = "Stasze") >>> d .save() >>> k = A.objects.create (name = "Stasze", related_name = s) return Database.Cursor.execute (kendi, sorgu, params) django.db.utils.IntegrityError: UNIQUE kısıtlama başarısız oldu: test_comp_a.name –

+0

* Bu bir kompozit PK değil *, bunu unutmayın. A' sınıfında 'name' özniteliğini PK olarak kullanıyor ve tekrarlanan bir nesne oluşturuyorsunuz. Eğer pek çok "A" nesnesinde aynı ada sahipseniz, bunu PK olarak kullanmayın, varsayılan olarak bir 'autoincrement' kullanın ve 'unique_together' hile yapacaktır. – Gocht

İlgili konular