2015-07-28 7 views

Odpowiedz

4

Powiedzmy, że obj1 i obj2 są 2 instancjami modelu MyModel.

Aby wiedzieć, które pola różnią się w dwóch wystąpieniach modelu Django, najpierw uzyskujemy wszystkie pola modelu i przechowujemy je w zmiennej my_model_fields.

my_model_fields = MyModel._meta.get_all_field_names() # gives me the list of all the model fields defined in it 

Następnie stosujemy filter() z lambda wiedzieć, które pola różnią się między nimi.

filter(lambda field: getattr(obj1,field,None)!=getattr(obj2,field,None), my_model_fields) 

Funkcja filter() będzie mi wrócić listę modeli, które różnią się między polami dwóch przypadkach.

+0

Dzięki za szybką reakcję! Próbowałem: my_model_fields = self._meta.get_all_field_names() # daje mi listę wszystkich pól modelu zdefiniowanych w nim filter (pole lambda: getattr (self, field, None)! = Getattr (orig, field, None) , my_model_fields) ... Które jest wywoływane w metodzie zapisu instancji, ale otrzymuję: Nazwa własna globalna NameError nie jest zdefiniowana ... Jakieś sugestie? – gabn88

+0

Nieważne! Jeśli zrobię changed_fields = filter (pole lambda: getattr (obj1, field, None)! = Getattr (obj2, field, None), my_model_fields) Wracam zmienione pola! – gabn88

+0

Może powinienem to zrobić w kolejnym pytaniu, ale jak mogę teraz zrobić: dla pola w changed_fields: qs = MyModel.objects.filter (something = something), qs.update (*** FIELD *** = F (pole)), jak wykonać *** FIELD **? – gabn88

Powiązane problemy