Czasami potrzebuję upewnić się, że niektóre wystąpienia są wykluczone z zestawu zapytań.
ten sposób robię to zazwyczaj:Django z wyłączeniem określonych instancji z zestawu zapytań bez korzystania z wyszukiwania pola
unwanted_instance = MyModel.objects.get(pk=bad_luck_number)
uninteresting_stuff_happens()
my_results = MyModel.objects.exclude(id=unwanted_instance.id)
lub, jeśli mam więcej z nich:
my_results = MyModel.objects.exclude(id_in=[uw_in1.id, uw_in2.id, uw_in3.id])
Ten 'czuje się' nieco niezgrabne, więc próbowałem:
my_ideally_obtained_results = MyModel.objects.exclude(unwanted_instance)
Co nie działa. Ale przeczytałem here on SO, że podzapytanie może być używane jako parametr do wykluczenia.
Czy mam pecha? Czy brakuje mi jakiejś funkcjonalności (sprawdziłem dokumenty, ale nie znalazłem przydatnego wskaźnika)?
Ponadto, jeśli masz th e zestaw pytań do wykluczenia (np. 'MyModel.objects.filter ()'), możesz uzyskać identyfikatory używając 'ValuesQuerySet': tak: ' id_dicts = MyModel.objects.filter (). Values ('id ') 'a następnie ' query.exclude (id__in = [item [' id '] dla elementu w id_dicts]) '. –
Prawie 4 lata później i ta odpowiedź rozwiązała mój problem. :-) – Garfonzo
Chciałem tylko dodać coś do sugestii @ RacingTadpole: Możesz łatwo użyć 'values_list (" id ", flat = True)', aby uzyskać sekwencyjną listę wszystkich identyfikatorów. To jednak trafi w DB, więc proponuję użyć zrozumienia list Pythona. – stschindler