Связать модели через внешний ключ, используя строковое поле (CharField) - PullRequest
0 голосов
/ 21 мая 2019

У меня есть 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 })

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

Я попытался установить имя проекта в качестве первичного ключа, но получаю ошибку с несколькими ключами. Я попытался установить его на уникальный, но он также не работает.

Я прочитал, что не рекомендуется использовать строки в качестве внешнего ключа, поскольку он нарушает общие внешние ключи. Но есть ли способ сделать это? Я думаю, это должно как-то сработать, но я больше не знаю ...

Любая помощь высоко ценится! Заранее спасибо!

1 Ответ

1 голос
/ 21 мая 2019

Вам нужно будет найти проект для использования при создании экземпляра 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.

...