[1]此代码未引发完整性错误的原因:唯一约束失败
在population.py文件中:-
行top=add_topic()将被调用10次,这意味着它将创建10次 主题表的实例,但无法创建10个主题表实例 因为它的列是唯一的。所以,我的问题是,这段代码是否应该抛出唯一的约束错误?因为它不是,而且运行得很好。为什么?
#models.py file
from django.db import models
# Create your models here.
class Topic(models.Model):
top_name = models.CharField(max_length = 264,unique = True )
def __str__(self):
return self.top_name
class Webpage(models.Model):
topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
name = models.CharField(max_length = 264, unique = True)
url = models.URLField(unique = True)
def __str__(self):
return self.name
class AccessRecord(models.Model):
name = models.ForeignKey(Webpage, on_delete=models.CASCADE)
date = models.DateTimeField()
def __str__(self):
return str(self.date)
#population.py file
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','protwo.settings')
import django
django.setup()
import random
from first_app.models import AccessRecord,Topic,Webpage
from faker import Faker
fakegen = Faker()
topics = ['Search', 'Social', 'Marketplace', 'News', 'Games']
def add_topic():
t = Topic.objects.get_or_create(top_name = random.choice(topics))[0]
t.save()
return t
def populate(N = 10):
for entry in range(N):
top = add_topic()
fake_url = fakegen.url()
fake_date = fakegen.date()
fake_name = fakegen.company()
webpg = Webpage.objects.get_or_create(topic = top, url = fake_url, name = fake_name)[0]
acc_rec = AccessRecord.objects.get_or_create(name = webpg, date = fake_date)[0]
if __name__ == "__main__":
print('populating script')
populate(20)
print('populating complete!')
#populationone.py file
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','advcbv.settings')
import django
django.setup()
from basicapp.models import Students, Schools
from faker import Faker
import random
fakegen = Faker()
allschools = ['Central Academy', 'Patanjali', 'LBS', 'Dev Prayag', 'SRM', 'DPS']
def add_topic():
fake_principal = fakegen.prefix() + fakegen.name()
fake_location = fakegen.address()
t = Schools.objects.get_or_create(sch_name = random.choice(allschools), principal = fake_principal, location = fake_location)[0]
t.save()
return t
def populate(n = 10):
for i in range(n):
school_obj = add_topic()
fake_name = fakegen.name()
fake_age = random.randint(10,16)
student_obj = Students.objects.get_or_create(school = school_obj, stud_name = fake_name, age = fake_age)[0]
if __name__ == '__main__':
print('populating script')
populate(20)
print('population complete')
#modelsone.py file
from django.db import models
# Create your models here.
class Schools(models.Model):
sch_name = models.CharField(max_length = 256,unique = True)
principal = models.CharField(max_length = 256)
location = models.CharField(max_length = 256)
def __str__(self):
return self.name
class Students(models.Model):
stud_name = models.CharField(max_length = 256)
school = models.ForeignKey(Schools, on_delete = models.CASCADE,related_name='related_students')
age = models.PositiveIntegerField()
def __str__(self):
return self.name
[以下是populateone.py引发的错误] [1] :https://i.stack.imgur.com/toGYp.png
如果top_name有
Unique=True
,则此字段在整个表中必须是唯一的但是由于
get_or_create
的原因,没有显示错误。这里get_or_create
的作用是返回一个元组,即(object,created)。第一个是您试图获取的模型的一个实例,第二个是一个标志,用于指示实例是否已创建True表示实例是通过get_or_create
方法创建的,False表示它是从数据库中检索到的如果实例不存在,
get_or_create
将创建一个实例。否则它只会更新现有实例相关问题 更多 >
编程相关推荐