使用faker在Django中填充模型

2024-04-20 15:19:22 发布

您现在位置:Python中文网/ 问答频道 /正文

[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


Tags: djangonamefrompyimportselftopicreturn
1条回答
网友
1楼 · 发布于 2024-04-20 15:19:22

如果top_name有Unique=True,则此字段在整个表中必须是唯一的

但是由于get_or_create的原因,没有显示错误。这里get_or_create的作用是返回一个元组,即(object,created)。第一个是您试图获取的模型的一个实例,第二个是一个标志,用于指示实例是否已创建True表示实例是通过get_or_create方法创建的,False表示它是从数据库中检索到的

如果实例不存在,get_or_create将创建一个实例。否则它只会更新现有实例

相关问题 更多 >