У меня есть API с двумя моделями. Эти модели я хотел бы связать с внешним ключом. Затем я хочу отправить данные, точнее, я хочу отправить строку. Если эта строка соответствует имени внешнего ключа, я хочу создать экземпляр. Вот так:
class Simulation(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, default=1)
project = models.ForeignKey(Project, on_delete=models.CASCADE,default=1, related_name = "projects")
class Project(models.Model):
project_name = models.CharField(max_length=120)
def __str__(self):
return self.project_name
Я отправляю данные так:
def test_api_local(method='get', data = {}):
r = requests.request(method, ENDPOINT , data=data, headers=headers)
return r
test_api_local(method = "post", data = {"user":2, "project":1 })
Хорошо, так что это работает. Таким образом, я создаю экземпляр с данными. Но что я хотел бы сделать, так это отправить имя моего проекта в виде строки и создать объект моделирования, в котором есть имя моего проекта. Но сейчас я могу отправлять только целые числа.
Я попытался установить имя проекта в качестве первичного ключа, но получаю ошибку с несколькими ключами. Я попытался установить его на уникальный, но он также не работает.
Я читал, что не рекомендуется использовать строки в качестве внешнего ключа, так как это нарушает общие внешние ключи. Но тогда есть ли способ сделать это? Я думаю, что это должно как-то работать, но я больше не знаю...
Любая помощь высоко ценится! Заранее спасибо!
Вам нужно будет найти проект для использования при создании экземпляра Simulation:
project, created = Project.objects.get_or_create(name=project_name)
Simulation.objects.create(project=project, user=some_user)
Также на вашем поле Simulation.project
related_name
должно быть simulations
. Related_name — это поле, доступное из модели, на которую указывает внешний ключ, поэтому в этом случае оно будет существовать в Project. В вашей версии это project_instance.projects
где проекты - это набор симуляций. Было бы больше смысла, если бы это было project_instance.simluations
.