Быстрая проверка существования отношения "многие-ко-многим" без лишних запросов в Django
На моей старой системе приложения, установленные для каждого сайта, выглядели бы следующим образом (если бы они были на Django):
class Website(models.Model):
name = models.CharField(max_length=255)
...
class Apps(models.Model):
website = models.ForeignKey(Website, on_delete=models.CASCADE)
blog = models.BooleanField(default=False)
shop = models.BooleanField(default=False)
...
# To see if the shop app is installed, you can easily do this from a `Website` instance loaded previously in the code
website = Website.objects.get(pk=1)
...
if website.apps.shop:
pass
Хорошо, что вы можете быстро проверить, установлено ли приложение, однако это кажется неправильным, так как вам нужна отдельная таблица приложений, в которой находится каждая деталь приложения, и эта таблица не связана с веб-сайтами.
Другое решение, которое соответствует конвенциям и лучшим практикам, я думаю, состоит в том, чтобы иметь отношения "многие-ко-многим", как это:
class App(models.Model):
name = models.CharField(max_length=255)
...
class Website(models.Model):
name = models.CharField(max_length=255)
apps = models.ManyToManyField(App)
...
# To see if the shop is installed, would I need to do this every time from a `Website` instance:
if website.apps.filter(name="shop").exists():
pass
Мне нравится последний вариант, так как он кажется более чистым, а таблица App
может иметь больше столбцов для хранения подробной информации о каждом приложении. Однако проверка, установлено ли приложение, довольно долгая и утомительная, особенно когда эта проверка часто выполняется или используется в представлениях.
Итак, мой вопрос: существует ли более чистый способ использования отношения "многие-ко-многим", о котором я не знаю, или я иду совершенно не в том направлении, и есть лучшее решение?