Создание уникального идентификатора путем объединения Charfield и ForeignKey из другой модели

#python #django #django-models #foreign-keys

#python #django #django-модели #внешние ключи

Вопрос:

У меня возникли проблемы с настройкой потока моего сайта с множеством взаимосвязей.

Например, существует много моделей, которые имеют много типов, и наоборот. У меня есть настроенный URL-адрес site / model / typed / detail

Поскольку typed и model — это ManyToMany, я не могу перейти на свою страницу сведений.

Я думаю, что могу обойти это, создав переменные, которые буквально связывают модель с типом, чтобы она могла использоваться в качестве уникального идентификатора внешнего ключа по деталям. Это будет выглядеть примерно так: site / model / model_type /detail

Однако у меня возникают проблемы с извлечением значений. Если есть более простой способ решить эту проблему, пожалуйста, дайте мне знать!

 class typed(models.Model):
typed = models.CharField(max_length=200, help_text='Enter MFG - Type')

model = models.ForeignKey('model', on_delete=models.SET_NULL, null=True)

model_type = model   typed

def get_absolute_url(self):
    return reverse('typed-detail', args=[str(self.model), str(self.model_type)])

def __str__(self):
    return self.model_type
 

Я получаю эту ошибку: TypeError: неподдерживаемые типы операндов для : ‘ForeignKey’ и ‘CharField’

Комментарии:

1. Пит, я могу быть совершенно неправ, но я не уверен, что это распространенный подход при моделировании с помощью ORM Django. С одной стороны, самый простой ответ — найти способ принудительного преобразования значений model и typed в строки, а затем объединить их, но, не зная больше о вашей цели и, возможно, одного или двух примеров того, как они будут связаны, я не уверен, что это решает большую проблему. Вы рассматривали возможность использования типа поля ManyToMany в Django? docs.djangoproject.com/en/3.1/topics/db/examples/many_to_many

Ответ №1:

вы можете сделать это

 class typed(models.Model):
typed = models.CharField(max_length=200, help_text='Enter MFG - Type')

model = models.ForeignKey('model', on_delete=models.SET_NULL, null=True)

def get_absolute_url(self):
    return reverse('typed-detail', args=[str(self.model), "%s%s" % (self.model,self.typed)])
 

Комментарии:

1. Это работает, я могу сказать, что он передает правильную часть, спасибо!

Ответ №2:

Каков ваш __str__ метод для model модели? Если это что-то вроде return self.title , вы можете попробовать это:

 def __str__(self):
    return str(self.model)  ' '   str(self.typed)
 

Комментарии:

1. Как насчет части get_absolute_url?