2015-12-21 18 views
5

Modellerimi inspectdb kullanarak oluşturdum, django bu tür bir endeks olduğu için aşağıdakileri oluşturduğunda bana garip geldi, ama benDjango 1.9 unique_together (ValueError) kısıtlı sayısını değiştiremez

olmasına izin verdim

(('p_id', 'v_id', 'SKU'), ('p_id', 'v_id', 'SKU')) şimdi

i 'sku2' eklemek = çalışıyorum unique_together Bu endeks ve 'taşınamayacak' için aşağıdaki başarısız oluyor:

: Bu benim modeli

File "/home/user/.pyenv/versions/2.7.11/envs/master2/lib/python2.7/site-packages/django/db/backends/base/schema.py", line 347, in _delete_composed_index 
    ", ".join(columns), 
ValueError: Found wrong number (2) of constraints for vendor_products(p_id, v_id, sku) 

olduğunu

class Products(models.Model): 
    p_id = models.OneToOneField(MasterProducts, models.DO_NOTHING, db_column='p_id', primary_key=True) 
    v_id = models.ForeignKey('Sellers', models.DO_NOTHING, db_column='v_id') 
    sku = models.TextField() 
    sku2 = models.TextField(blank=True, null=True) 

    class Meta: 
     managed = True 
     db_table = 'products' 
     unique_together = (('p_id', 'v_id', 'sku',), ('p_id', 'v_id', 'sku',)) 
i (('p_id', 'v_id', 'Stok',),) ve ('p_id', 'v_id', 'SKU'ya') ile aynı sonucu için unique_together değişen çalıştı.

Ayrıca db kullanarak benzersiz dizini silme ve django kullanarak yeniden oluşturmayı denedim ve hala sku2 eklememe izin vermiyor.

Bu neden oluyor, nasıl düzeltirim?

+1

Anahtar kelimeyle "django-south" kullandığınızı tahmin edebilirim. Bunu kullanma. 1.7'den Django'ya dahildir. – baldr

+0

geçişleri kullanarak, değiştirdim – jayshilling

+0

Kısıtlamaları neden iki kez ayarlıyorsunuz? – baldr

cevap

4

Daha derine inmemiştim ama Django 1.8'imden biraz kaynak araştırıyor. Bu kod bölümünün aynı olacağını düşünüyorum.

Benim tahminim bu ifadeye yanlış kısıtlamaları yarattık:

unique_together = (('p_id', 'v_id', 'sku',), ('p_id', 'v_id', 'sku',)) 

Sen göçü yarattı ve onu uyguladık. Veritabanında iki aynı kısıtlama yarattı. Teknik olarak izin verilir, ancak hiçbir anlamı yoktur.

Bundan sonra değiştirmeye çalıştım ve burada django.db.backends.base.schema._delete_composed_index() nedeniyle Django'nın doğrulama için hata var - bu veritabanından tüm kısıtlamaları toplar ve tek olduğunu doğrular:

def _delete_composed_index(self, model, fields, constraint_kwargs, sql): 
    columns = [model._meta.get_field(field).column for field in fields] 
    constraint_names = self._constraint_names(model, columns, **constraint_kwargs) 
    if len(constraint_names) != 1: 
     raise ValueError("Found wrong number (%s) of constraints for %s(%s)" % (
      len(constraint_names), 
      model._meta.db_table, 
      ", ".join(columns), 
     )) 

O olmak zorunda Aynı modülün alter_unique_together işlevinden çağrıldı.

Peki şimdi ne yapmanız gerekiyor?

  • elle veritabanı ve açın yinelenen kısıtlamayı silin.
  • Kısıtlamalar için aynı anahtarları KULLANMAYIN.
+0

bahsettiğim gibi 1) bu dizini manuel olarak silmeyi 2) modelden siler ve --fake geçirir 3) "unique_together = (('p_id', 'v_id', 'sku ekleyerek) ',' " – jayshilling

+0

," sku2 "geçişlerini eklemeye çalıştığımda tam olarak aynı hatayı üretiyor – jayshilling

+0

Eski göçleri" geçişler "klasöründen siliyor musunuz? Belki eskileri mi uygular? – baldr

İlgili konular