Poniższy kod jest podany:Django modelu podklasy: Get podklasy przez odpytywanie nadklasę
class BaseMedium(models.Model):
title = models.CharField(max_length=40)
slug = models.SlugField()
class A(BaseMedium):
url = models.URLField()
class B(BaseMedium):
email = models.EmailField()
teraz chcę zapytać każdą BaseMedium.
b = BaseMedium.objects.all()
Jak wydrukować wszystkie informacje, w tym pola podklas, nie wiedząc, jaki jest typ podklasy?
b[0].a
byłoby wydrukowanie informacji jeśli b[0]
jest rzeczywiście związane z wystąpieniem A
ale jeśli jest to związane z B
byłoby wydrukować DoesNotExist
wyjątku.
Ma to sens, ale chciałbym mieć wspólną zmienną lub metodę, która zwraca powiązany obiekt.
Może mój układ bazy danych nie jest zbyt dobry, aby zapytać w ten sposób, więc byłbym zadowolony, gdybyś polecił lepszy układ.
Myślałem o użyciu GenericForeignKey
class Generic(models.Model):
basemedium = models.ForeignKey('BaseMedium')
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
object = generic.GenericForeignKey('content_type', 'object_id')
ale to rozwiązanie wydaje się być skomplikowana i myślę, że macie lepsze rozwiązania.
Powinieneś być ostrożny z tym. Jeśli masz 1000 rekordów do pobrania z DB, zostanie to wykonane w jednym SELECT, ale wtedy będzie 1000 pojedynczych wyborów, aby uzyskać podtyp dla każdego obiektu BaseMedium. W każdym razie nie wiem, jak to zrobić. Używam czegoś podobnego, co powoduje wiele dodatkowych zapytań db ... – dzida
Strzelaj, masz rację. Własny sql może być opcją ... Dziwne jest to, że nie rozumiem, jak to nie jest powszechny problem ze znanym rozwiązaniem. – rotrotrot