首页 > 解决方案 > 如果尚不存在,Django 多对一创建父(“一个”)条目

问题描述

我有一个类似的设置,因为 django 的文档描述了多对一的场景。

https://docs.djangoproject.com/en/3.0/topics/db/examples/many_to_one/

from django.db import models

class Reporter(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.EmailField()

    def __str__(self):
        return "%s %s" % (self.first_name, self.last_name)

class Article(models.Model):
    headline = models.CharField(max_length=100)
    pub_date = models.DateField()
    reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)

    def __str__(self):
        return self.headline

    class Meta:
        ordering = ['headline']

我遇到的情况是Reporter尚不存在,但Article可以为不存在创建reporter,所以我希望Article模型在Reporter它不存在的情况下创建。我想我需要的是检查是否Reporter已经存在,如果不创建一个新的。这是最好的方法吗?或者 Django 有更好的内置方法吗?所有记者都有特定的 ID,即

我对 Django 很陌生,很难找到有关这方面的资源,可能是因为我缺少术语,所以我可以指出我已经得到帮助的正确方向!

标签: pythondjangodjango-models

解决方案


您正在寻找get_or_createupdate_or_create函数。

reporter, created_reporter = Reporter.objects.get_or_create(
    email=reporter_email,
    first_name=reporter_first_name,
    last_name=reporter_last_name,
)
reporter.articles.create(...)

此外,如果您使Reporter.email唯一性,您可以执行以下更强大的操作,因为它利用了您的数据库唯一性约束。

reporter, created_reporter = Reporter.objects.get_or_create(
    email=report_email,
    defaults={
        "first_name": reporter_first_name,
        "last_name": reporter_last_name,
    }
)

这样做将根据电子邮件检查报告者是否存在,如果不存在,它将使用默认值创建一个。


推荐阅读