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

1 投票
1 回答
1073 浏览
提问于 2025-04-18 07:08
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-admin页面在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()

1 个回答

1

我理解你的意思是,你的逻辑键是由 nameunique_together 组合而成的,你想用这个组合来调用 get_or_create()

首先,要明白 unique_together 是用来创建数据库约束的。它并不能被“使用”,而且 Django 对这个信息没有做什么特别的处理。

另外,目前 Django 不能使用复合自然主键,所以你的模型默认会有一个自动递增的整数主键。不过,你仍然可以把 nameunique_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 约束,你只需在想要唯一指定一个实例时同时使用这两个字段。

撰写回答