Django-Modellvererbung – nur Instanzen der übergeordneten Klasse in einer Abfrage

Sagen wir, ich habe 2 Modelle, einer ist der Elternteil eines anderen. Wie kann ich alle Orte abfragen, die keine Restaurants in Django sind? Place.objects.all () würde alle Restaurants richtig? Ich möchte die Kinder aus den Ergebnissen ausschließen. Vielen Dank!

class Place(models.Model): name = models.CharField(max_length=50) address = models.CharField(max_length=80) class Restaurant(Place): serves_hot_dogs = models.BooleanField() serves_pizza = models.BooleanField() 

  • Django 1.8 ArrayField append & erweitern
  • Wie kann ich meine secret_key mit virtualenv und Django verbergen?
  • Sqlalchemy erstellen Tabellen
  • Schreiben von Testfällen für Django-Modelle
  • Wie man das queryset eines models.ModelChoiceField auf einer form.Form-Unterklasse dynamisch festlegt
  • Beste Weg, um Abfrage String aus einer URL in Python?
  • 3 Solutions collect form web for “Django-Modellvererbung – nur Instanzen der übergeordneten Klasse in einer Abfrage”

    Nach der Dokumentation können Sie die Existenz des Kleinbuchstabennamens als Attribut überprüfen:

     places = Place.objects.all() not_restaurants = [p for p in places if not hasattr(p, 'restaurant')] 

    Der einfache Weg ist, ein place_type Attribut auf dem Place Modell zu haben und dann überschreiben Sie für Place , Restaurant und jede andere Basisklasse, um es richtig zu setzen, wenn es place_type wird. Sie könnten dann mit Place.objects.filter(place_type='PLACE') abfragen. Es könnte andere Wege geben, aber sie werden sehr schnell sehr behaart.

    Filtern Sie auf Djangos automatisch erstelltem OneToOneField . Wenn es IS NULL , ist dieser Place kein Restaurant .

     non_restaurant_places = Place.objects.filter(restaurant__isnull=True) 
    Python ist die beste Programmiersprache der Welt.