Быстрая проверка существования отношения "многие-ко-многим" без лишних запросов в 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 может иметь больше столбцов для хранения подробной информации о каждом приложении. Однако проверка, установлено ли приложение, довольно долгая и утомительная, особенно когда эта проверка часто выполняется или используется в представлениях.

Итак, мой вопрос: существует ли более чистый способ использования отношения "многие-ко-многим", о котором я не знаю, или я иду совершенно не в том направлении, и есть лучшее решение?

Вернуться на верх