我有一个具有两个模型的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 })
好,这样行得通。这样,我用数据创建一个实例。但是我想做的是将项目名称作为字符串发送,并创建一个包含对象名称的模拟对象。但是现在我只能发送整数。
我尝试将项目名称设置为主键,但是出现多键错误。我尝试将其设置为唯一,但也无法正常工作。
我读到不建议将字符串用作外键,因为它会破坏通用外键。但是,有办法吗?我认为这必须以某种方式起作用,但是我不知道了...
我们非常感谢您的帮助!预先感谢!
答案 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
,就更有意义了。