【问题标题】:Relate models via Foreign Key using a string field (CharField)使用字符串字段 (CharField) 通过外键关联模型
【发布时间】:2019-10-07 06:45:42
【问题描述】:

我有一个有两个模型的 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 })

好的,这样就可以了。像这样,我用数据创建了一个实例。但我想做的是将我的项目名称作为字符串发送并创建一个模拟对象,其中包含我的项目名称。但是现在我只能发送整数。

我尝试将项目名称设置为主键,但出现多键错误。我尝试将其设置为唯一,但它也无法正常工作。

我读到不建议使用字符串作为外键,因为它会破坏通用外键。但是,有没有办法做到这一点?我认为这必须以某种方式起作用,但我不知道了......

非常感谢任何帮助!提前致谢!

【问题讨论】:

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


    【解决方案1】:

    您需要在创建模拟实例时查找要使用的项目:

    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,就更有意义了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-09
      • 1970-01-01
      • 2016-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-23
      • 1970-01-01
      相关资源
      最近更新 更多