【问题标题】:How to use unique_together method in django views如何在 django 视图中使用 unique_together 方法
【发布时间】:2014-07-09 07:52:57
【问题描述】:
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()

【问题讨论】:

  • 您好,您正在将您的 Model 类扩展到 Model1 和 Model2。您已经为模型 2 创建了 a、b 对象。您在这里遇到什么问题?
  • 这个问题真的没有意义。 unique_together 不是方法,而是约束。你不调用它,也不用它做任何事情。

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


【解决方案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 用于在创建或更新的情况下提供附加数据。见the documentation

总之,要“使用”unique_together 约束,只要您想唯一指定一个实例,您只需将这两个字段一起使用即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2017-08-23
    • 2022-08-02
    相关资源
    最近更新 更多