在单个表单字段上获取或创建

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_companyvisitor_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=Falsenull=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