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

时间:2015-07-26 00:13:16

标签: django django-models django-forms django-views

我在模型中有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,那么逻辑将在返回get之前测试所有3个字段是否相同。我只想将其应用于visitor_email

3 个答案:

答案 0 :(得分:3)

首先,如果您希望visitor_email对于每个Visitor都是唯一的,那么您应该为该字段设置unique约束为True

visitor_email = models.EmailField(max_length=128, unique=True)

请注意,您可以省略blank=Falsenull=False,因为它们是默认值。

Django 1.7 开始,update_or_create()被引入;

  

使用给定 kwargs 更新对象的便捷方法,必要时创建一个新对象。 默认值是用于更新对象的(字段,值)对的字典。

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)
        ...

答案 1 :(得分:1)

我可能会这样做:

try:
    email = Visitor.objects.get(visitor_email=email)
except Visitor.DoesNotExist:
    #create new one

答案 2 :(得分:0)

if Visitor.objects.get(visitor_email=email).exists():
    #Create new entry
 else: 
     #your logic for updating company and name