python - 如果尚不存在,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 很陌生,很难找到有关这方面的资源,可能是因为我缺少术语,所以我可以指出我已经得到帮助的正确方向!
解决方案
您正在寻找get_or_create或update_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,
}
)
这样做将根据电子邮件检查报告者是否存在,如果不存在,它将使用默认值创建一个。
推荐阅读
- windows - 如何在安装程序中分发使用 Windows 运行时的 Windows 应用程序?
- python - 从 json 中抓取特定值
- c++ - Eclipse CDT 包含 C/C++ 标准库
- sql - 如何在 jsonb 对象数组上应用过滤器 - 聚合后?
- android - 使用 Retrofit 时响应是 url 编码的
- javascript - React js - onSwipe() 事件后数组不更新
- angular - Angular Drag & Drop:cdkDrag 项拖放到嵌套的 cdkDropLists
- python - Python simple if != or != not working in stings
- css - 根据孩子的身高调整父DIV的高度并设置溢出?就像一个旋转木马,它的高度会随着内容的滚动而调整
- wordpress - Woocommerce > 隐藏缺货但跳过带有特定标签的产品