如何创建一个可重用的函数来在Django 1.8中使用多个空值强制执行“unique_together”?

时间:2015-06-26 00:03:08

标签: python django rest

我正在使用django 1.8和带有角度前端的REST 3.0。

我在我的模型上的两个字段的元类上设置了unique_together。 它不能很好地工作,因为它不允许field1和field2为null的多个情况。 我需要这些字段都是可选的 或者如果一个人有一个值,那么另一个人也必须有一个值。 它们应该是唯一的(unique_together)

到目前为止我所拥有的是荒谬和丑陋的。我不知道如何更好或更有效地写它,但是我想学习如何以更加Pythonic的方式做到这一点。

data = json.loads(request.body)
#field1 and field2 are nested in an array that is only POSTed if it exists. 

if 'key' in 'data':
    field1 = data[key].get(field1,"")
    field2 = data[key].get(field2,"")

elif 'key' not in 'data':
   field1 = "" 
   field2 = ""

if field1=="" and field2=="":
   field1 = None
   field2 = None

elif (field1 == "") and (field2 != ""):
   data.errors += 'You added field 2 but did not add field 1.'

elif (field1 !="") and (field2 ==""):
   data.errors += 'You added field 1 but did not add field 2.'

elif (field1 = "") and (country_code!=""):
   try:
       field1Db = [model].objects.get(field1=field1)
   except [model].DoesNotExist:
       valid_field1 = True
   else:
       if field1Db and ((field1Db.field2)) == (field2):
       data.errors += Field 1 + 'and' + Field 2 + 'should form a unique set if both are submitted.'
else:
   data.errors = False
   data.success = True
   return Response(data)

它似乎有效,只是丑陋。

在此之后,我将数据发送到序列化程序。 无论如何,如果有人知道如何更有效地做到这一点,我真的很感激学习如何。谢谢。

1 个答案:

答案 0 :(得分:1)

使用unique_together验证提供两个值时的情况。然后在模型中添加clean方法,以确保提供这两个值,或者两者都不提供。

class MyModel(models.Model):
    ... 
    def clean(self):
        """
        Make sure that if field1 or field2 is specified, 
        then they are both specified.
        """
        if self.field1 is not None and self.field2 is None:
            raise ValidationError('you must specify field2 if you specify field1')
        elif self.field1 is None and self.field2 is not None:
            raise ValidationError('you must specify field1 if you specify field2')