如何在django视图中使用unique_together方法

时间:2014-05-20 21:21:14

标签: python django python-2.7 django-models django-views

class Model1(models.Model):
     username = models.CharField(max_length=100,null=False,blank=False,unique=True)
     password = models.CharField(max_length=100,null=False,blank=False)

class Model2(models.Model):
     name = models.ForeignKey(Model1, null=True)
     unique_str = models.CharField(max_length=50,null=False,blank=False,unique=True)
     city = models.CharField(max_length=100,null=False,blank=False)
     class Meta:
           unique_together = (('name', 'unique_str'),)

我已经在Model1到django-admin页面填写了3个示例用户名密码

在我的观看中,我将此列表视为

userlist = Model1.objects.all()
#print userlist[0].username, userlist[0].password

for user in userlist:
     #here I want to get or create model2 object by uniqueness defined in meta class.
     #I mean unique_str can belong to multiple user so I'm making name and str together as a unique key but I dont know how to use it here with get_or_create method.
     #right now (without using unique_together) I'm doing this (but I dont know if this by default include unique_together functionality )
     a,b = Model2.objects.get_or_create(unique_str='f3h6y67')
     a.name = user
     a.city = "acity"
     a.save()

1 个答案:

答案 0 :(得分:1)

我认为您说的是,您的逻辑密钥是nameunique_together的组合,您可以使用该密钥作为{{1}的调用的基础}。

首先,了解get_or_create()创建数据库约束。没有办法使用它,而且Django对这些信息没有做任何特别的事情。

此外,此时Django无法使用复合自然主键,因此默认情况下您的模型将具有自动递增的整数主键。但您仍然可以使用unique_togethername作为密钥。

查看您的代码,您似乎想要这样做:

unique_str

在Django 1.7上,您可以使用a, _ = Model2.objects.get_or_create(unique_str='f3h6y67', name=user.username) a.city = 'acity' a.save()

update_or_create()

在任何一种情况下,关键点是a, _ = Model2.objects.update_or_create(unique_str='f3h6y67', name=user.username, defaults={'city': 'acity'}) 的关键字参数用于查找对象,而_or_create用于在创建或更新的情况下提供其他数据。请参阅the documentation

总而言之,"使用" defaults约束只要您想要唯一地指定实例,就可以将两个字段一起使用。