Статический класс объекта / ключи как внешний ключ в модели Django

#python #django #django-models

#python #django #django-модели

Вопрос:

Я нахожусь на новой территории с Django / Python. Я создаю сайт, на котором пользователь выбирает из списка доступных сервисов, а затем вводит информацию об этих сервисах.

Я не хотел хранить список служб в базе данных, потому что это действительно больше информации о конфигурации сайта, чем о пользователе. Итак, я устанавливаю их как класс объекта (рекомендованный другом)

 class Service(object):
    def __init__(self, name, sections, link,  enabled=True):
        self.name = name
        self.link = link
        self.sections = sections
        self.enabled = enabled

SERVICES = {
    'SERVICE1': ArtistService(
        'Service Name',
        ['Section Name 1','Section Name 2',],
        'http://www.service.com',
    ),
  

Возможно ли использовать этот класс в качестве внешнего ключа в базе данных? Я хотел бы получить некоторую информацию о службе из класса через объединение шаблонов. Пример:

 {% for s in user_activated_services %}
    {{ s.service.name }}    
{% endfor %}
  

Но это не работает, потому что я просто сохраняю ключ в символьном поле в модели user_activated_services:

 class ActivatedServices(models.Model):
    user_page = models.ForeignKey(Page)
    service = models.CharField(max_length=20, choices=[(k, s.name) for k, s in userservices.services.SERVICES.iteritems()])
  

Когда я пытаюсь заменить внешним ключом, я получаю сообщение об ошибке «Первым параметром для внешнего ключа должна быть либо модель, либо название модели, либо строка ‘self'»

В любом случае, я думаю, что знаю проблему, я просто не могу ее исправить. Надеюсь, этой информации достаточно. Я уверен, что я упускаю что-то глупое.

Заранее спасибо.

Ответ №1:

Возможно ли использовать этот класс в качестве внешнего ключа в базе данных?

Нет.

В качестве внешних ключей могут использоваться только models.Model классы.

«Внешний ключ» — это концепция базы данных.

Если вы хотите использовать в качестве внешних ключей объекты, не относящиеся к базе данных, это просто строки или числа, а «ссылка» — это простое сопоставление, которым вы управляете в своем коде.