使用字符串字段(CharField)通过外键关联模型

时间:2019-05-20 21:58:28

标签: django django-models django-rest-framework foreign-keys

我有一个具有两个模型的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 个答案:

答案 0 :(得分: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,就更有意义了。