在单个表单字段上获取或创建
Get or create on a single form field
我在模型中有 3 个字段:
class Visitor(models.Model):
visitor_company = models.ForeignKey(Company)
visitor_name = models.CharField(default='', max_length=128, blank=False, null=False)
visitor_email = models.EmailField(default='', max_length=128, blank=False, null=False)
我想创建一个 ModelForm,首先检查 visitor_email
是否唯一,如果是,只需更新 visitor_company
和 visitor_name
,否则创建一个新条目。
我应该使用什么逻辑或函数?如果我使用 get_or_create
,那么逻辑将测试所有 3 个字段是否相同,然后再 returns 获取。我只想将其应用于 visitor_email
.
我可能会这样做:
try:
email = Visitor.objects.get(visitor_email=email)
except Visitor.DoesNotExist:
#create new one
首先,如果您希望 visitor_email
对于每个 Visitor
都是唯一的,那么您应该将该字段的 unique
约束设置为 True
:
visitor_email = models.EmailField(max_length=128, unique=True)
请注意,您可以省略 blank=False
、null=False
,因为它们是默认值。
从 Django 1.7 开始,引入了 update_or_create()
;
A convenience method for updating an object with the given kwargs, creating a new one if necessary. The defaults is a dictionary of (field, value) pairs used to update the object.
updated_fields = {'company': Company.objects.first(), 'visitor_name': 'John Doe'}
visitor, created = Visitor.objects.update_or_create(visitor_email='ozgur@example.org', defaults=defaults)
为了将此方法与 Form
结合使用:
def view(request):
if request.method == 'POST':
data = request.POST.copy()
form = VisitorForm(data)
if form.is_valid():
visitor, created = Visitor.objects.update_or_create(
visitor_email=data.pop('visitor_email'), defaults=data)
...
if Visitor.objects.get(visitor_email=email).exists():
#Create new entry
else:
#your logic for updating company and name
我在模型中有 3 个字段:
class Visitor(models.Model):
visitor_company = models.ForeignKey(Company)
visitor_name = models.CharField(default='', max_length=128, blank=False, null=False)
visitor_email = models.EmailField(default='', max_length=128, blank=False, null=False)
我想创建一个 ModelForm,首先检查 visitor_email
是否唯一,如果是,只需更新 visitor_company
和 visitor_name
,否则创建一个新条目。
我应该使用什么逻辑或函数?如果我使用 get_or_create
,那么逻辑将测试所有 3 个字段是否相同,然后再 returns 获取。我只想将其应用于 visitor_email
.
我可能会这样做:
try:
email = Visitor.objects.get(visitor_email=email)
except Visitor.DoesNotExist:
#create new one
首先,如果您希望 visitor_email
对于每个 Visitor
都是唯一的,那么您应该将该字段的 unique
约束设置为 True
:
visitor_email = models.EmailField(max_length=128, unique=True)
请注意,您可以省略 blank=False
、null=False
,因为它们是默认值。
从 Django 1.7 开始,引入了 update_or_create()
;
A convenience method for updating an object with the given kwargs, creating a new one if necessary. The defaults is a dictionary of (field, value) pairs used to update the object.
updated_fields = {'company': Company.objects.first(), 'visitor_name': 'John Doe'}
visitor, created = Visitor.objects.update_or_create(visitor_email='ozgur@example.org', defaults=defaults)
为了将此方法与 Form
结合使用:
def view(request):
if request.method == 'POST':
data = request.POST.copy()
form = VisitorForm(data)
if form.is_valid():
visitor, created = Visitor.objects.update_or_create(
visitor_email=data.pop('visitor_email'), defaults=data)
...
if Visitor.objects.get(visitor_email=email).exists():
#Create new entry
else:
#your logic for updating company and name