Джанго: внешний ключ к двум моделям - PullRequest
1 голос
/ 09 марта 2019

Я пытаюсь создать приложение в Django.Допустим, у меня есть эта модель:

class Server(model.Models):
    hosted_by = models.ForeignKey('Self', limit_choices_to={'backup_server': True})
    host = models.BooleanField(default=False)

Этот класс определяет сервер.

Каждый сервер может быть хостом, что означает, что он может размещать другие серверы (виртуальные).Таким образом, каждый сервер может быть размещен на другом сервере.Это легко.

Но вот проблема: хост может быть частью кластера хостов.Итак, виртуальный сервер может быть размещен на автономном хосте или в кластере.Когда сервер размещается в кластере, я не хочу указывать, какой хост в кластере.

Я не знаю, как управлять "hosted_by".Я пытался использовать Contenttype и общие отношения, но это было совсем не удобно для пользователя в разделе администратора.

Я создал новую модель:

class Cluster(models.Model):

Итак, мой Сервер теперь выглядит так:

class Server(model.Models):
    hosted_by = models.ForeignKey('Cluster' ...)
    host = models.BooleanField(default=False)
    member_of_cluster = models.ForeignKey('Cluster' ...)

Кроме того, что мой Сервер дважды связан с Кластером (но с related_name это работает), теперь хост может быть связан только с кластером ...

Есть ли простой и простой способ сделать что-то вроде:

hosted_by = models.ForeignKey('Self' OR 'Cluster', ...) 

Это было быполезно в моем случае: P

В любом случае, я застрял с этим.Конечно, я мог бы сделать что-то вроде:

hosted_by_cluster = models.ForeignKey('Cluster' ...)
hosted_by_standalone_host = models.ForeignKey('Self', limit_choices_to={'backup_server': True})
host_standalone = models.BooleanField(default=False)
member_of_cluster = models.ForeignKey('Cluster' ...)

Но я не уверен, что мне нравится идея ...

Кроме того, прежде чем серьезно задуматься над этим, я попытался, чтобы каждый хостбыть в кластере.Так что у меня будет кластер только с одним хостом.Я тоже не уверен, хорошая ли это идея.

Любая помощь будет принята с благодарностью.Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

После нескольких размышлений я решил пойти с решением, что каждый хостинг-сервер находится в кластере. Таким образом, я могу добавить другой сервер в кластер, если это необходимо.

0 голосов
/ 09 марта 2019

Вы можете удалить ограничение not null по умолчанию для внешних ключей:

class Server(model.Models):
    hosted_by = models.ForeignKey('Self', blank=True, null=True, ...)
    host = models.BooleanField(default=False)
    member_of_cluster = models.ForeignKey('Cluster', blank=True, null=True, ...)

Затем создайте триггеры в вашей БД, чтобы установить для столбца hosted_by значение null при каждом добавлении значения илиобновлено до member_of_cluster

DELIMITER $$
CREATE TRIGGER before_insert_server
BEFORE INSERT ON server
FOR EACH ROW 
BEGIN
IF NEW.member_of_cluster IS NOT NULL THEN
    SET NEW.hosted_by = NULL;
END IF;
END $$

CREATE TRIGGER before_update_server
BEFORE UPDATE ON server
FOR EACH ROW 
BEGIN
IF NEW.member_of_cluster IS NOT NULL THEN
    SET NEW.hosted_by = NULL;
END IF;
END $$
DELIMITER ;

Обратите внимание , что я не знаю, какую БД вы используете, и синтаксис триггера написан для MySQL, и что я не уверен, что этоприменимо к вашей ситуации, или если это вообще хорошая идея.Это просто то, что пришло мне в голову.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...