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'),)
我已经通过django管理页面在Model1中填写了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()
发布于 2014-05-20 14:10:07
我认为您的意思是,您的逻辑键是name
和unique_together
的组合,您要使用它作为调用get_or_create()
的基础。
首先,理解unique_together
创建了一个数据库约束。没有办法使用它,Django对这些信息也没有做什么特别的事情。
而且,此时Django不能使用复合的自然主键,因此在默认情况下,您的模型将有一个自动递增的整数主键。但是您仍然可以使用name
和unique_str
作为密钥。
看看您的代码,您似乎想这样做:
a, _ = Model2.objects.get_or_create(unique_str='f3h6y67',
name=user.username)
a.city = 'acity'
a.save()
在Django 1.7上,您可以使用update_or_create()
a, _ = Model2.objects.update_or_create(unique_str='f3h6y67',
name=user.username,
defaults={'city': 'acity'})
在这两种情况下,关键是_or_create
的关键字参数用于查找对象,而defaults
用于在创建或更新的情况下提供额外的数据。见文献资料。
总之,要“使用”unique_together
约束,只要您想要唯一地指定一个实例,只需同时使用这两个字段。
https://stackoverflow.com/questions/23770190
复制相似问题