2015-10-15 22 views
5

Dinamik seçimli bir modelim var ve eğer bir kodun söz konusu olması durumunda kodun çalıştırıldığını garanti edersem boş bir seçim listesi vermek istiyorum. django-admin.py migrate/makemigrations ya işe yaramaz seçim değişiklikleri hakkında ya yaratmayı ya da uyarmayı engelleyen komut.Kodun migrate/makemigrations komutu bağlamında çalıştırılıp çalıştırılmadığını tespit edin

Kodu: Ben o zaman çıkışa boş seçim listesi seçebilir lazy_discover_foreign_id_choices yılında çalışma bağlamı algılayabilir eğer

from artist.models import Performance 
from location.models import Location 

def lazy_discover_foreign_id_choices(): 
    choices = [] 

    performances = Performance.objects.all() 
    choices += {performance.id: str(performance) for performance in performances}.items() 

    locations = Location.objects.all() 
    choices += {location.id: str(location) for location in locations}.items() 

    return choices 
lazy_discover_foreign_id_choices = lazy(lazy_discover_foreign_id_choices, list) 


class DiscoverEntry(Model): 
    foreign_id = models.PositiveIntegerField('Foreign Reference', choices=lazy_discover_foreign_id_choices(),) 

Yani düşünürdüm. sys.argv ve __main__.__name__ testlerini düşünüyordum ama muhtemelen daha güvenilir bir yol veya bir API var mı?

+1

Seçimleriniz tam olarak nasıl dinamik? Bazı kodlar gönderir misiniz? – aumo

+0

Elbette, kod eklendi – DanH

+0

"Performans" ve "Yer" i nasıl içe aktarıyorsunuz? – Ivan

cevap

2

Gerçek bir işlem yapmadan önce bir bayrağı ayarlamak için Django makemigrations komutunu alt sınıf olarak düşünebilirsiniz.

Örnek:

, <someapp>/management/commands/makemigrations.py bu kodu koy o Django varsayılan makemigrations komutunu geçersiz kılar.

from django.core.management.commands import makemigrations 
from django.db import migrations 


class Command(makemigrations.Command): 
    def handle(self, *args, **kwargs): 
     # Set the flag. 
     migrations.MIGRATION_OPERATION_IN_PROGRESS = True 

     # Execute the normal behaviour. 
     super(Command, self).handle(*args, **kwargs) 

Aynı işlemi migrate komutu için de yapın.

Ve Dinamik seçimler işlevini değiştirin:

from django.db import migrations 


def lazy_discover_foreign_id_choices(): 
    if getattr(migrations, 'MIGRATION_OPERATION_IN_PROGRESS', False): 
     return [] 
    # Leave the rest as is. 

Çok hacky ama kurulumu oldukça kolaydır.

import sys 
def lazy_discover_foreign_id_choices(): 
    if ('makemigrations' in sys.argv or 'migrate' in sys.argv): 
     return [] 
    # Leave the rest as is. 

Bu, tüm durumlar için çalışması gerekir:

+0

Öneriniz için teşekkürler, ama bu işe yaramıyor. Model alan seçimlerinin Command.handle() ' – DanH

+0

'dan önce çalıştırıldığını görüyorum ve bir projede denedim ve işe yaradı, araştırmaya gidiyorum. – aumo

+0

@DanH Django 1.8.5'in temiz yüklemesinde iyi çalıştığını onaylıyorum, varsayılanı değil, çalıştırılan yeni komut olduğundan emin misiniz? – aumo

4

İşte (django zaten bizim için bayraklar oluşturur beri) bunu yapmak için oldukça olmayan hacky yoludur.

+0

Oh, bunu yapmak için gerçekten iyi bir yol. –

İlgili konular