gpt4 book ai didi

django - django 中的独特约束

转载 作者:搜寻专家 更新时间:2023-10-30 23:27:24 25 4
gpt4 key购买 nike

我在 Django 中有一个包含人员和角色的数据库。人员与角色具有一对多的关系。问题是角色没有唯一的约束,例如 adam 和 david 可以是角色中的艺术家,但 django 创建了两个相同的艺术家条目,但我想要相同的条目,即 adam 和 david 应该指向一个条目。如果我将 unique 添加到我的角色字段而不是 django 说它应该是一对一的。有什么想法吗?

model.py 的一部分:

from django.db import models
from phonenumber_field.modelfields import PhoneNumberField

# Create your models here.
# possibillitas models here

class Person(models.Model):

mail=models.EmailField(default='yourname@gmail.com')
firstName=models.CharField(max_length=200,default='firstname')
lastName=models.CharField(max_length=200,default='lastname')
phoneNumber=PhoneNumberField()
streetAdress=models.CharField(max_length=200,default='streetAdress')
zipcode=models.CharField(max_length=200)
city=models.CharField(max_length=200,default='Göteborg')
country=models.CharField(max_length=200,default='Sweden')

def __str__(self):
return "%s %s" % (self.firstName,self.lastName)

class Meta:
ordering = ('firstName','lastName')

class Role(models.Model):

role=models.CharField(max_length=200)
# person=models.ManyToManyField(Person)
person=models.ForeignKey(Person,on_delete=models.CASCADE)

def __str__(self):
return self.role

class Meta:
ordering = ('role',)

class Name(models.Model):

name=models.CharField(max_length=200)
role=models.ForeignKey(Role,on_delete=models.CASCADE)

def __str__(self):
return self.name

class Meta:
ordering = ('name',)

为下面的答案修改了 admin.py:

from django.contrib import admin
from .models import Role,Alias,Address,Date,Person,Name

from django.conf.urls import url, include

# Register your models here.

admin.site.register(Role)
admin.site.register(Address)
admin.site.register(Date)
admin.site.register(Name)
admin.site.register(Alias)
admin.site.register(Person)

class AliasInline(admin.TabularInline):

# model=Role.person.through
model=Alias
extra=2

class RoleInline(admin.TabularInline):

# model=Role.person.through
model=Role
extra=2

class NameInline(admin.TabularInline): # nested inlines doesn't work

#class NameInline(admin.ModelAdmin): # nested inlines doesn't work

model=Name
extra=3

class PersonInline(admin.ModelAdmin):

fieldsets=[
(None,{'fields': ['mail','firstName','lastName','phoneNumber','streetAdress','zipcode','city','country']}),
]
inlines = [RoleInline]
search_fields = ['firstName']

最佳答案

简而言之:我认为唯一性约束应该放在 roleRole 的属性模型,以防止一个创建多个 Rolerole相同属性。

将其建模为多对多关系

在我看来,您想在这里使用多对多 关系,因为这意味着 Person可以有很多 Role s 和一个 Role可以与很多关联Person

您可能应该制作 role字段(虽然 name 在这里可能更好)唯一,这样一个不能创建两个具有相同名称的角色:

class Role(models.Model):
role = models.CharField(max_length=200<b>, unique=True</b>)
<b>persons = models.ManyToManyField(Person, related_name='roles'</b>)

def __str__(self):
return self.role

class Meta:
ordering = ('role',)

我们可以创建两个 Person都是艺术家,例如:

role_artist, __ = Role.objects.get_or_create(role='artist')

adam = Person.objects.create(firstName='Adam')
david = Person.objects.create(firstName='David')

adam.roles.add(role_artist)
david.roles.add(role_artist)

Name作为through模型

Name您定义的模型,似乎可以用作 Through模型:它向关系添加额外的数据。例如一个人可能有两个 Name s:一个是歌手,一个是电影明星。这通常是 through model [Django-doc] 的用例可以在关系中对额外数据进行编码,尽管将其命名为 Alias 可能更好(或者至少是一个更具描述性的名称)。

我们可以将其改造为:

class Role(models.Model):
role = models.CharField(max_length=200, unique=True)
persons = models.ManyToManyField(Person<b>, through='Alias'</b>, related_name='roles')

def __str__(self):
return self.role

class Meta:
ordering = ('role',)

class <b>Alias</b>(models.Model):

name = models.CharField(max_length=200)
role = models.ForeignKey(Role, on_delete=models.CASCADE)
person = models.ForeignKey(Person, on_delete=models.CASCADE)

def __str__(self):
return self.name

class Meta:
ordering = ('name',)

然后我们可以制作两个 Person s adamdavid都是艺术家,每个人都有他们的艺术家名字:

role_artist, __ = Role.objects.get_or_create(role='artist')

adam = Person.objects.create(firstName='Adam')
david = Person.objects.create(firstName='David')

Alias.objects.create(name='Adam the magician', role=role_artist, person=adam)
Alias.objects.create(name='David the lion tamer', role=role_artist, person=david)

甚至有可能 Person有多个Alias ses,对于相同的角色。

结束语

Note: according to PEP 8 the naming convention is that attributes are lowercase and words are separated with underscores. So that means that it should be first_name instead of firstName.

关于django - django 中的独特约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54894181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com