2017-06-19 49 views
7

Chcę zachować model Django z unikalnym identyfikatorem dla każdej kombinacji opcji w modelu. Chciałbym wtedy móc zaktualizować model o nowe pole i nie mieć poprzedniej zmiany unikalnego identyfikatora. Identyfikatory mogą być hash lub integer lub cokolwiek. Jaki jest najlepszy sposób, aby to osiągnąć?Używanie Django ORM, Jak utworzyć niepowtarzalny skrót dla wszystkich możliwych kombinacji

class MyModel(models.Model): 
    WINDOW_MIN = 5 
    WINDOW_MAX = 7 
    WINDOW_CHOICES = [(i,i) for i in range(WINDOW_MIN - 1, WINDOW_MAX - 1)] 
    window = models.PositiveIntegerField('Window', editable=True, default=WINDOW_MIN, choices=WINDOW_CHOICES) 
    is_live = models.BooleanField('Live', editable=True, default=False) 
    unique_id = .... 

Biorąc pod uwagę powyższy przykład, będzie 3 * 2 == 6 unikalnych identyfikatorów. Jeśli dodaję inne edytowalne pole logiczne, nie chcę zmieniać poprzednich unikalnych identyfikatorów, ale chcę wygenerować nowy unikalny identyfikator dla nowego pola boolowskiego.

Proces myślenia za tym jest parametrem w MyModel zdefiniować wejścia do funkcji, których wyniki są przechowywane w innym Django modelu MyResultModel przez unique_id i nazwę modelu. Uzasadnieniem jest to, że istnieje wiele wariantów MyModel, z których każdy ma własne unikalne kombinacje, które są regularnie aktualizowane, ale zestaw wyników w MyResultModel jest taki sam dla MyModel1 na MyModelN. Idealnie chciałbym, aby identyfikator unique_id's był automatycznie generowany. Innymi słowy kluczem do zestawu wyników przechowywanego w MyResultModel jest nazwa_modelu (MyModel) i unikalny_id. Chcę sanely zarządzać tak wielu (MyModel1, ... MyModelN) do jednej relacji (MyResultModel).

class MyResultModel(models.Model): 
    unique_id = ... 
    model_name = models.CharField(max_length=200, default='', blank=False) # Points to a Django Model ex MyModel 
    result1 = ... 
    result2 = ... 
+2

To brzmi jak [XY problemu] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) do mnie. Co próbujesz osiągnąć, robiąc to? – Chris

+0

@Chris Dodam więcej informacji o tym, dlaczego uważam, że powyższe ma sens. – pyCthon

+0

Zgadzam się z komentarzem @Chris, nadal spróbuję odpowiedzieć. –

Odpowiedz

4

wspólne podejście, biorąc pod uwagę, że wszystkie opcje są numery boolean, kategoryczne lub małe, można po prostu spakować je w polu większe bitowym (https://en.wikipedia.org/wiki/Bit_field) i kiedy dodać nową opcję, należy go wcisnąć do najbardziej znaczącej części twojego pola bitowego i unikaj posiadania wartości 0 (to jest proste dodawaj 1 do dowolnego). Nie tylko każdy unikalny identyfikator reprezentuje inną konfigurację, można nawet obejść się bez modelu i po prostu użyć operacji bitowych, aby wyodrębnić wszystkie wartości z pola bitowego.

+0

Jest teraz https://github.com/disqus/django-bitfield Teraz muszę tylko sprawdzić, w jaki sposób mogę je automatycznie wygenerować, nie tracąc starych, gdy dodaję nowe pole. – pyCthon

+0

Nie jestem tego obeznany, ale z dokumentów, z szybkiego wyglądu, wygląda na to, że działa tylko z flagami typu Boolean. Jest to ten sam pomysł, można zapisać pełny "model" za pomocą tego podejścia, ale trzeba go dostosować, aby móc przechowywać numery. –

+0

Tak, prawda, wygląda na to, że mogę korzystać z tego pakietu w rzeczywistości https://github.com/goodmase/django-bitfield-manager – pyCthon

1

mam 2 rzeczy: Po pierwsze, jeśli chcesz po prostu stworzyć unikalny hash dla wszystkich kombinacji

# Just set it all together like 
uniq= cb1+cb2+cb3... (a string key is ok =)) 
# If it is very very long string ~> we think about using hash to short it (and have same size for all value). 

a następnie:

za pytanie powyżej:

mogę” Rozumiesz, dlaczego sprawiasz, że model staje się skomplikowany (jak bałagan), ale wciąż musisz go rozwiązać:

Jak przeczytałem twoje pytania: masz ma ny wariantów modeli ~> chcesz zebrać go w 1 model res?

Więc: lepiej jest ustawić FK

map = models.ForeignKey(Model_name, null=True) 
# but if you have too many model, it can't be help... 

Więc polecam:

~ tworzyć tylko 1 model, bo jeśli masz zbyt wiele modelu, nie można nawet nazwać go pobierz dane (tak jak to zrobiłeś), ale gdy dodasz więcej FIELD, unikalny id ~> powinien się zmienić.

Dobrym sposobem, aby mieć specjalną unique_id:

wykorzystywane pierwsze rozwiązanie powiedziałem.

Lub:

Tworzenie NEW stolik tylko do przechowywania COMBO:

Nowa tabela będzie miała wszystkie pola i ustawić wartość dla każdego (lub można napisać skrypt, aby go utworzyć). ~> Masz identyfikator dla każdej combo ~>to samo jako unikatowy identyfikator

Można utworzyć wszystkie możliwe combo lub po prostu sprawdzić i dodać Kiedy nowe kombi pojawi się

+0

1 rzecz, aby zachować pełną ostrożność (dodając nowe pole, musisz ustawić domyślną wartość lub ustaw ją jako NULL) –