我在模型中有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
,那么逻辑将在返回get之前测试所有3个字段是否相同。我只想将其应用于visitor_email
。
答案 0 :(得分:3)
首先,如果您希望visitor_email
对于每个Visitor
都是唯一的,那么您应该为该字段设置unique
约束为True
:
visitor_email = models.EmailField(max_length=128, unique=True)
请注意,您可以省略blank=False
,null=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