天道酬勤,学无止境

Django中的唯一模型字段和区分大小写(postgres)(Unique model field in Django and case sensitivity (postgres))

问题

考虑以下情况:-

假设我的应用允许用户在其国家中创建州/省。 为了清楚起见,我们在这里仅考虑ASCII字符。

在美国,用户可以创建一个名为“德克萨斯州”的州。 如果该应用程序在内部使用,可以说用户不在意它是否拼写为“ texas”或“ Texas”或“ teXas”

但重要的是,如果数据库中已存在“德州”,则系统应阻止创建“德州”。

如果模型如下所示:

class State(models.Model):
    name = models.CharField(max_length=50, unique=True)

在postgres中,唯一性将区分大小写; 也就是说,postgres将允许用户创建“德克萨斯州”和“德克萨斯州”,因为它们被认为是唯一的。

在这种情况下可以采取什么措施来防止这种行为。 如何使用Django和Postgres提供不区分大小写的唯一性

现在,我正在执行以下操作以防止创建不区分大小写的重复项。

class CreateStateForm(forms.ModelForm):
    def clean_name(self):
        name = self.cleaned_data['name']
        try:
            State.objects.get(name__iexact=name)
        except ObjectDoesNotExist:
            return name
        raise forms.ValidationError('State already exists.')

    class Meta:
        model = State

在很多情况下,我将必须执行此检查,并且我不希望在任何地方编写类似的iexact检查。

只是想知道是否有内置的或更好的方法? 也许db_type会有所帮助? 也许存在其他解决方案?

回答1

您可以定义派生自models.CharField的自定义模型字段。 该字段可以检查重复值,而忽略大小写。

自定义字段文档在此处http://docs.djangoproject.com/en/dev/howto/custom-model-fields/

请查看http://code.djangoproject.com/browser/django/trunk/django/db/models/fields/files.py,以获取有关如何通过子类化现有字段来创建自定义字段的示例。

您可以使用PostgreSQL的citext模块https://www.postgresql.org/docs/current/static/citext.html

如果使用此模块,则定制字段可以将“ db_type”定义为PostgreSQL数据库的CITEXT。

这将导致对自定义字段中的唯一值进行不区分大小写的比较。

回答2

或者,您可以更改默认的查询集管理器以在字段上进行不区分大小写的查找。 在尝试解决类似问题时,我遇到了:

http://djangosnippets.org/snippets/305/

为方便起见,将代码粘贴到此处:

from django.db.models import Manager
from django.db.models.query import QuerySet

class CaseInsensitiveQuerySet(QuerySet):
    def _filter_or_exclude(self, mapper, *args, **kwargs):
        # 'name' is a field in your Model whose lookups you want case-insensitive by default
        if 'name' in kwargs:
            kwargs['name__iexact'] = kwargs['name']
            del kwargs['name']
        return super(CaseInsensitiveQuerySet, self)._filter_or_exclude(mapper, *args, **kwargs)

# custom manager that overrides the initial query set
class TagManager(Manager):
    def get_query_set(self):
        return CaseInsensitiveQuerySet(self.model)

# and the model itself
class Tag(models.Model):
    name = models.CharField(maxlength=50, unique=True, db_index=True)

    objects = TagManager()

    def __str__(self):
        return self.name
回答3

Mayuresh答案的显式步骤:

  1. 在postgres中执行:CREATE EXTENSION citext;

  2. 在您的models.py中添加:

     from django.db.models import fields class CaseInsensitiveTextField(fields.TextField): def db_type(self, connection): return "citext"

    参考:https://github.com/zacharyvoase/django-postgres/blob/master/django_postgres/citext.py

  3. 在模型中使用:name = CaseInsensitiveTextField(unique = True)

回答4

在Postgres方面,功能上唯一的索引将使您无需大小写即可强制执行唯一值。 还指出了citext,但这将与旧版本的PostgreSQL一起使用,并且通常是一种有用的技术。

例子:

# create table foo(bar text);
CREATE TABLE
# create unique index foo_bar on foo(lower(bar));
CREATE INDEX
# insert into foo values ('Texas');
INSERT 0 1
# insert into foo values ('texas');
ERROR:  duplicate key value violates unique constraint "foo_bar"
回答5

一个非常简单的解决方案:

class State(models.Model):
    name = models.CharField(max_length=50, unique=True)

    def clean(self):
        self.name = self.name.capitalize()
回答6

除了已经提到的覆盖保存的选项外,您还可以将所有文本以小写形式存储在数据库中,并在显示时大写。

class State(models.Model):
    name = models.CharField(max_length=50, unique=True)

    def save(self, force_insert=False, force_update=False):
        self.name = self.name.lower()
        super(State, self).save(force_insert, force_update)
回答7

您可以在序列化程序的UniqueValidator中使用lookup ='iexact',如下所示:

class StateSerializer(serializers.ModelSerializer): 
    name = serializers.CharField(validators=[
    UniqueValidator(
        queryset=models.State.objects.all(),lookup='iexact'
    )]

django版本:1.11.6

回答8

您可以通过覆盖模型的save方法来做到这一点-请参阅文档。 您基本上会做类似的事情:

class State(models.Model):
    name = models.CharField(max_length=50, unique=True)

    def save(self, force_insert=False, force_update=False):
        if State.objects.get(name__iexact = self.name):
            return
        else:
            super(State, self).save(force_insert, force_update)

同样,我对此可能是错的,但是即将到来的模型验证SoC分支将使我们能够更轻松地执行此操作。

回答9

如果您不想使用特定于Postgres的解决方案,则可以使用upper()在字段upper()创建唯一索引以在数据库级别实施唯一性,然后创建一个覆盖get_lookup()的自定义Field mixin来转换get_lookup() -区分大小写的敏感查询。 mixin看起来像这样:

class CaseInsensitiveFieldMixin:
    """
    Field mixin that uses case-insensitive lookup alternatives if they exist.
    """

    LOOKUP_CONVERSIONS = {
        'exact': 'iexact',
        'contains': 'icontains',
        'startswith': 'istartswith',
        'endswith': 'iendswith',
        'regex': 'iregex',
    }

    def get_lookup(self, lookup_name):
        converted = self.LOOKUP_CONVERSIONS.get(lookup_name, lookup_name)
        return super().get_lookup(converted)

您可以像这样使用它:

from django.db import models


class CICharField(CaseInsensitiveFieldMixin, models.CharField):
    pass


class CIEmailField(CaseInsensitiveFieldMixin, models.EmailField):
    pass


class TestModel(models.Model):
    name = CICharField(unique=True, max_length=20)
    email = CIEmailField(unique=True)

您可以在此处阅读有关此方法的更多信息。

回答10

来自suhail的解决方案为我工作,而无需启用citext,这是一个非常简单的解决方案,只是一个干净的函数,而不是大写,我使用了upper() 。 Mayuresh的解决方案也可以使用,但是将字段从CharField更改为TextField

class State(models.Model):

    name = models.CharField(max_length=50, unique=True)

    def clean(self):
        self.name = self.name.upper()

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • fastapi之tortoise-orm
    目录 概述fastapi引入创建对应数据模型创建Model设置数据库字段field字段介绍 自定义字段设置MetaModel模型方法 查询Q对象查询字段过滤预取F表达式功能和聚合事务 根据Model生成Schema 概述 fastapi是一个很优秀的框架,但是缺少一个合适的orm,官方代码里面使用的是sqlalchemy,异步也是使用的这个。但是我这边看到有tortoise-orm这个异步orm框架,不知道效率如何,这里先学习,之后做一个性能测试比较一下。 整个框架非常接近django,如果我没写的地方,要么是和django差不多,要么是没这功能。 fastapi引入 在main.py文件里面引入如下代码: from fastapi import FastAPI, HTTPException from pydantic import BaseModel from models import User_Pydantic, UserIn_Pydantic, Users from tortoise.contrib.fastapi import HTTPNotFoundError, register_tortoise app = FastAPI(title="Tortoise ORM FastAPI example") ... register_tortoise(#这里是启动app的
  • Django唯一一起约束失败?(Django unique together constraint failure?)
    问题 使用Django 1.5.1。 Python 2.7.3。 我想用一个外键字段和一个子字段来做一个唯一的共同约束。 所以在我的模型meta中,我做了 foreign_key = models.ForeignKey("self", null=True, default=None) slug = models.SlugField(max_length=40, unique=False) class Meta: unique_together = ("foreign_key", "slug") 我什至检查了Postgres(9.1)中的表描述,并将约束放入数据库表中。 -- something like "table_name_foreign_key_id_slug_key" UNIQUE CONSTRAINT, btree (foreign_key_id, slug) 但是,我仍然可以将None / null和重复的字符串的Foreign_key保存到数据库表中。 例如, 我可以输入并保存 # model objects with slug="python" three times; all three foreign_key(s) # are None/null because that is their default value MO(slug="python").save
  • 如何使用两种属性完全不同的用户设置Django模型(How to set up Django models with two types of users with very different attributes)
    问题 注意:自从1.5版以来,由于Django用户模型的更新,我再次问了这个问题。 我正在重建和改进现有的Django网站,并将其从Webfaction移至Heroku,从Amazon的SimpleDB移至Heroku Postgres(尽管在开发时在Sqllite3上进行了本地测试)。 我正在做的很多事情都是使用内置的Django功能,例如Django admin,用户身份验证等。 从概念上讲,该网站具有两种用户:学生和企业。 两种类型的用户具有完全不同的权限和有关它们的信息存储。 这种情况非常多,以至于在站点的原始结构中,我们按如下所示设置数据模型: Users ID (primary_key) Business_or_Student ('B' if business, 'S' if student) email (unique) password (hashed, obviously) ... Students ID (Foreignkey on Users) <more information> ... Businesses ID (Foreignkey on Users) <more information> ... 这对我们来说效果很好,我们在“用户”表中有准用户信息,然后在“学生和企业”表中有更详细的信息。 要获得用户的完整个人资料,需要使用以下伪代码: def
  • Django中的复合主键(Composite primary key in django)
    问题 我有一个具有复合主键的旧式数据库表。 我认为我无法更改结构以包含代理键,因为编写了一些使用该表的代码。 在django中,我无法使用该表,因为它没有主键(非复合键)。 Django模型是否支持复合主键? 如果不是,是否有任何解决方法而不更改表的结构? PS我正在使用postgresql。 回答1 尝试类似的以下代码: class MyTable(models.Model): class Meta: unique_together = (('key1', 'key2'),) key1 = models.IntegerField(primary_key=True) key2 = models.IntegerField() 或者,如果您只想要唯一的混合字段: class MyTable(models.Model): class Meta: unique_together = (('key1', 'key2'),) key1 = models.IntegerField() key2 = models.IntegerField() 编辑:我想指出,如果有3列,则此方法存在问题。 更新查询不起作用,因为它尝试更新(唯一设置在“ SET”之后的pk字段)唯一的字段,并且显然失败。 回答2 接受的答案很好。 但是,它有点旧了。 为支持UniqueConstraint
  • Django动态模型字段(Django dynamic model fields)
    问题 我正在开发一个多租户应用程序,其中一些用户可以定义自己的数据字段(通过管理员)以收集表单中的其他数据并报告数据。 后一点使得JSONField不是一个很好的选择,所以我有以下解决方案: class CustomDataField(models.Model): """ Abstract specification for arbitrary data fields. Not used for holding data itself, but metadata about the fields. """ site = models.ForeignKey(Site, default=settings.SITE_ID) name = models.CharField(max_length=64) class Meta: abstract = True class CustomDataValue(models.Model): """ Abstract specification for arbitrary data. """ value = models.CharField(max_length=1024) class Meta: abstract = True 请注意,CustomDataField如何具有Site的ForeignKey-每个Site将具有一组不同的自定义数据字段
  • 在Django中允许为空的唯一字段(Unique fields that allow nulls in Django)
    问题 我有模型Foo,它具有栏杆。 bar字段应该是唯一的,但是允许为空,这意味着如果bar字段为null ,那么我想允许多个记录,但是如果它不为null则值必须是唯一的。 这是我的模型: class Foo(models.Model): name = models.CharField(max_length=40) bar = models.CharField(max_length=40, unique=True, blank=True, null=True, default=None) 这是该表的相应SQL: CREATE TABLE appl_foo ( id serial NOT NULL, "name" character varying(40) NOT NULL, bar character varying(40), CONSTRAINT appl_foo_pkey PRIMARY KEY (id), CONSTRAINT appl_foo_bar_key UNIQUE (bar) ) 当使用管理界面在bar为null的情况下创建1个以上的foo对象时,它给我一个错误:“带有此Bar的Foo已经存在。” 但是,当我插入数据库(PostgreSQL)时: insert into appl_foo ("name", bar) values ('test1', null)
  • Rails模型中不区分大小写的搜索(Case-insensitive search in Rails model)
    问题 我的产品型号包含一些物品 Product.first => #<Product id: 10, name: "Blue jeans" > 我现在要从另一个数据集中导入一些产品参数,但是名称的拼写不一致。 例如,在另一个数据集中,“ Blue jeans可以拼写为“ Blue Jeans 。 我想要Product.find_or_create_by_name("Blue Jeans") ,但这将创建一个新产品,几乎与第一个相同。 如果我想查找和比较小写的名字,该怎么办? 性能问题在这里并不是真正重要的:只有100-200种产品,我想将其作为导入数据的迁移来运行。 有任何想法吗? 回答1 您可能需要在这里更加详细 name = "Blue Jeans" model = Product.where('lower(name) = ?', name.downcase).first model ||= Product.create(:name => name) 回答2 这是Rails中的完整设置,仅供我参考。 如果它也对您有帮助,我感到很高兴。 查询: Product.where("lower(name) = ?", name.downcase).first 验证者: validates :name, presence: true, uniqueness: {case_sensitive
  • 在现有的Django应用中更改主键的最佳方法是什么?(What is the best approach to change primary keys in an existing Django app?)
    问题 我有一个处于测试版模式的应用程序。 该应用程序的模型具有一些带有显式primary_key的类。 结果,Django使用了这些字段,并且不会自动创建一个id。 class Something(models.Model): name = models.CharField(max_length=64, primary_key=True) 我认为这是个坏主意(在Django admin中保存对象时,请参见unicode错误),我想回过头来为模型的每个类创建一个ID。 class Something(models.Model): name = models.CharField(max_length=64, db_index=True) 我已经对模型进行了更改(将每个primary_key = True替换为db_index = True),我想向南迁移数据库。 不幸的是,迁移失败并显示以下消息: ValueError: You cannot add a null=False column without a default value. 我正在评估此问题的不同解决方法。 有什么建议? 谢谢你的帮助 回答1 同意,您的模型可能是错误的。 正式主键应始终是代理键。 没别的。 [强硬的话。 自1980年代以来一直是数据库设计师。 得到的重要经验教训是:一切都是可变的
  • Django-使用电子邮件登录(Django - Login with Email)
    问题 我希望django通过电子邮件而非用户名对用户进行身份验证。 一种方法可以提供电子邮件值作为用户名值,但我不希望那样。 原因是,我有一个URL /profile/<username>/ ,因此我不能有一个URL /profile/abcd@gmail.com/ 。 另一个原因是所有电子邮件都是唯一的,但有时用户名已被使用。 因此,我会自动将用户名创建为fullName_ID 。 我该如何更改才能让Django通过电子邮件进行身份验证? 这就是我创建用户的方式。 username = `abcd28` user_email = `abcd@gmail.com` user = User.objects.create_user(username, user_email, user_pass) 这就是我的登录方式。 email = request.POST['email'] password = request.POST['password'] username = User.objects.get(email=email.lower()).username user = authenticate(username=username, password=password) login(request, user) 除了先获取用户名外,登录还有其他方法吗? 回答1
  • 如何通过Django中的contrib.auth使模型用户中的电子邮件字段唯一(How to make email field unique in model User from contrib.auth in Django)
    问题 我需要通过确保电子邮件字段条目唯一来修补contrib.auth的标准用户模型: User._meta.fields[4].unique = True 代码在哪里最好做到这一点? 我想避免使用数字字段[4] 。 最好使用用户fields ['email'] ,但字段不是字典,而是列表。 另一个想法可能是打开一个新票证,然后在settings.py上传带有新参数的补丁程序: AUTH_USER_EMAIL_UNIQUE = True 关于在Django用户模型中实现电子邮件地址唯一性的最正确方法有何建议? 回答1 警告:以下代码是为Django的较早版本编写的(在引入自定义用户模型之前)。 它包含竞争条件,并且仅应与SERIALIZABLE的事务隔离级别和请求范围的事务一起使用。 您的代码将无效,因为字段实例的属性是只读的。 我担心这可能比您想的要复杂一些。 如果仅使用表单创建User实例,则可以定义一个强制执行以下行为的自定义ModelForm: from django import forms from django.contrib.auth.models import User class UserForm(forms.ModelForm): class Meta: model = User def clean_email(self): email = self
  • day3_模型
    1、模型概述 **模型(Models):**用来构建和操作你的web应用中的数据,模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。通常,每个模型对应数据库中唯一的一张表。 模板(Templates):模板层提供了设计友好的语法来展示信息给用户。使用模板方法可以动态地生成HTML。模板包含所需HTML 输出的静态部分,以及一些特殊的语法,描述如何将动态内容插入。 视图(views):用于封装负责处理用户请求及返回响应的逻辑。视图可以看作是前端与数据库的中间人,它会将前端想要的数据从数据库中读出来给前端。也会将用户要想保存的数据写到数据库。 2、ORM 2.1ORM概念 ORM(Object Relational Mapping),由于python是面向对象的编程语言,而数据库是采用关系作为基础,ORM的作用是为了让我们采用面向对象的思路设计数据库,使数据库设计更加简单。 2.2 优势 Django的ORM操作本质上会根据对接的数据库引擎,翻译成对应的sql语句;所有使用Django开发的项目无需关心程序底层使用的是MySQL、Oracle、sqlite....,如果数据库迁移,只需要更换Django的数据库引擎配置即可。 二、Model层开发过程 1、安装数据库驱动 pip install mysqlclient 注意三种方式 2、数据库配置
  • Python笔记:Django框架的模型层详解
    Model模型 模型是你的数据的唯一的、权威的信息源。它包含你所储存数据的必要字段和行为。通常,每个模型对应数据库中唯一的一张表。每个模型都是django.db.models.Model的一个Python 子类。模型的每个属性都表示为数据库中的一个字段。Django 提供一套自动生成的用于数据库访问的API;这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动。备注:本文基于django版本1.11展开, 技术栈会有所升级, 仅供参考! 模型与数据库的关系 模型(Model)负责业务对象和数据库的关系映射(ORM)ORM是“对象-关系-映射”的简称,主要任务是: 根据对象的类型生成表结构将对象、列表的操作,转换为sql语句将sql查询到的结果转换为对象、列表 使用ORM,我们就可以不用像以前一样写sql语言了 为什么要用模型 Model是MVC框架中重要的一部分,主要负责程序中用于处理数据逻辑的部分。通常模型对象负责在数据库中存取数据它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 配置Mysql数据库 1 ) 在当前环境中安装mysql $ sudo apt-get install mysql-server$ sudo apt install mysql-client$ sudo apt install
  • django.db.utils.IntegrityError:唯一约束失败:rango_category__new.slug(django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category__new.slug)
    问题 我正在使用Django从Tango中学习Django,但是在输入时,我始终收到此错误: python manage.py makemigrations rango python manage.py migrate 这是输出: django.db.utils.IntegrityError: UNIQUE constraint failed: rango_category__new.slug Models.py: from django.db import models from django.template.defaultfilters import slugify class Category(models.Model): name = models.CharField(max_length=128, unique=True) views = models.IntegerField(default=0) likes = models.IntegerField(default=0) slug = models.SlugField(unique=True) def save(self, *args, **kwargs): self.slug = slugify(self.name) super(Category, self).save(*args, **kwargs) def
  • Django中唯一的BooleanField值?(Unique BooleanField value in Django?)
    问题 假设我的models.py像这样: class Character(models.Model): name = models.CharField(max_length=255) is_the_chosen_one = models.BooleanField() 我只希望我的Character实例之一具有is_the_chosen_one == True而所有其他实例具有is_the_chosen_one == False 。 我怎样才能最好地确保遵守这种唯一性约束? 考虑到在数据库,模型和(管理员)表单级别遵守约束的重要性的答案的最高分! 回答1 每当需要完成此任务时,我要做的就是覆盖模型的save方法,并让它检查是否有其他模型已经设置了标志(并将其关闭)。 class Character(models.Model): name = models.CharField(max_length=255) is_the_chosen_one = models.BooleanField() def save(self, *args, **kwargs): if self.is_the_chosen_one: try: temp = Character.objects.get(is_the_chosen_one=True) if self != temp: temp.is_the
  • Django模型MultipleChoice(Django Model MultipleChoice)
    问题 我知道没有Model的MultipleChoiceField ,您只能在Forms上使用它。 今天,当我分析与多项选择相关的新项目时遇到一个问题。 我想有一个领域像CharField有choices有多种选择的选项。 我通过创建CharField来解决此问题,并使用forms.MultipleChoiceField管理表单中的多个选择并存储用逗号分隔的选择。 在这个项目中,由于配置,我不能这样做,因为我上面提到的,我需要做的是在型号,我不喜欢编辑Django管理形式既不使用形式。 我需要一个具有多个选择选项的“模型字段” 有人通过Models解决了类似问题吗? 也许重写某些模型功能或使用自定义小部件...我不知道,我有点迷失在这里。 编辑 我知道一些简单的选择,我想拥有一些类似的东西: class MODEL(models.Model): MY_CHOICES = ( ('a', 'Hola'), ('b', 'Hello'), ('c', 'Bonjour'), ('d', 'Boas'), ) ... ... my_field = models.CharField(max_length=1, choices=MY_CHOICES) ... 但具有保存多项选择的能力,而不仅仅是一项选择。 回答1 您需要考虑如何在数据库级别存储数据。 这将决定您的解决方案。
  • week11 day7 模型层
    week11 day7 模型层 模型层一、django测试环境的搭建二、单表查询关键字(精准查找)必知必会13条 三、神奇的双下划线查询(范围查询)四、图书管理系统的表设计五、外键字段的增删改查5.1 一对多绑定外键增删改5.2 多对多绑定外键增删改查 六、基于对象的跨表查询(子查询)七、基于下划线的跨表查询(链表查询)八、聚合查询aggregate九、分组查询annotate十、F和Q查询十一、django中开启事务十二、ORM中常用字段及参数十三、字段关系 / 手动创建第三张表 / 元信息 / 原生SQL13.1 字段关系13.2 手动创建第三张表的三种方式13.3 元信息13.4 原生SQL 补充: 模型层 一、django测试环境的搭建 pycharm链接数据库都需要自己先下载驱动的。自带的sqlite3对日期格式不敏感。如果后续业务需要使用日期辅助筛选数据,那么不推荐使用自带数据库,而使用MySQL。 django默认是一个整体,不会让你单独操作其中的某一个模块。所以需要配置或者利用django自带的python console。 """ 当你只是想测试django中的某一个py文件内容,那么你可以不同书写前后端交互的形式而是直接写一个测试脚本即可 """ 测试环境的准备: 第一种方法:把manage.py里面的前四行代码拷贝过来,后面加上import
  • django OneToOneField和ForeignKey有什么区别?(What's the difference between django OneToOneField and ForeignKey?)
    问题 什么是Django的之间的区别OneToOneField和ForeignKey ? 回答1 请注意, OneToOneField(SomeModel)和ForeignKey(SomeModel, unique=True)之间存在一些差异。 如《 Django权威指南》中所述: 一对一一对一的关系。 从概念上讲,这类似于具有unique=True的ForeignKey ,但是关系的“反向”侧将直接返回单个对象。 与OneToOneField “反向”关系相反, ForeignKey “反向”关系返回QuerySet 。 例子 例如,如果我们有以下两个模型(下面是完整的模型代码): Car模型使用OneToOneField(Engine) Car2模型使用ForeignKey(Engine2, unique=True) 在python manage.py shell执行以下命令: OneToOneField示例 >>> from testapp.models import Car, Engine >>> c = Car.objects.get(name='Audi') >>> e = Engine.objects.get(name='Diesel') >>> e.car <Car: Audi> 带有unique=True示例的ForeignKey >>> from testapp
  • Django:模型中的列表字段?(Django: List field in model?)
    问题 在我的模型中,我想要一个包含三联列表的字段。 例如[[1, 3, 4], [4, 2, 6], [8, 12, 3], [3, 3, 9]] 。 是否存在可以将这些数据存储在数据库中的字段? 回答1 您可以使用JSON将其转换为字符串并将其存储为字符串。 例如, In [3]: json.dumps([[1, 3, 4], [4, 2, 6], [8, 12, 3], [3, 3, 9]]) Out[3]: '[[1, 3, 4], [4, 2, 6], [8, 12, 3], [3, 3, 9]]' 您可以将方法添加到类中以自动为您转换。 import json class Foobar(models.Model): foo = models.CharField(max_length=200) def set_foo(self, x): self.foo = json.dumps(x) def get_foo(self): return json.loads(self.foo) 如果您使用的是Django 1.9和postgresql,则有一个名为JSONField的新类,您应该改用它。 这是它的链接 在youtube上有关于PostgreSQL JSON和数组的好话。 观看它,它具有非常好的信息。 回答2 如果您使用的是Django 1.10或更高版本的AND
  • 在Django模型中使用UUID作为主键(通用关系影响)(Using a UUID as a primary key in Django models (generic relations impact))
    问题 由于多种原因^,我想在某些Django模型中使用UUID作为主键。 如果这样做,我是否仍可以使用通过ContentType使用通用关系的外部应用程序,例如“ contrib.comments”,“ django-voting”或“ django-tagging”? 以“ django-voting”为例,Vote模型如下所示: class Vote(models.Model): user = models.ForeignKey(User) content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() object = generic.GenericForeignKey('content_type', 'object_id') vote = models.SmallIntegerField(choices=SCORES) 该应用似乎假设要投票的模型的主键是整数。 内置的注释应用程序似乎能够处理非整数PK,但是: class BaseCommentAbstractModel(models.Model): content_type = models.ForeignKey(ContentType, verbose_name=_('content type')
  • django的auth_user.username可以为varchar(75)吗? 那怎么办呢?(Can django's auth_user.username be varchar(75)? How could that be done?)
    问题 在auth_user上运行alter table将username设为varchar(75)以便可以容纳电子邮件,这有什么问题吗? 那有什么坏处呢? 如果要将auth_user.username更改为varchar(75) ,则需要在哪里修改django? 将源代码中的30更改为75仅仅是一个问题吗? username = models.CharField(_('username'), max_length=30, unique=True, help_text=_("Required. 30 characters or fewer. Letters, numbers and @/./+/-/_ characters")) 还是在此字段上还有其他需要更改的验证,或对此有其他影响? 有关执行此操作的原因,请参见下面与bartek的评论讨论。 编辑:几个月后回首此事。 对于不知道前提的任何人:某些应用程序不需要或不希望使用用户名,它们仅使用电子邮件进行注册和身份验证。 不幸的是,在django auth.contrib中,需要用户名。 您可以开始在用户名字段中放入电子邮件,但是该字段只有30个字符,现实世界中电子邮件可能很长。 可能比此处建议的75个字符更长,但75个字符可容纳大多数理智的电子邮件地址。 问题是针对这种情况的,这是基于电子邮件身份验证的应用程序所遇到的。 回答1