2017-08-10 78 views
0

我试图用Django做一些练习并编写一个简单的博客应用程序。我想用脚本创建我的模型,所以我不必使用shell或管理界面。使用人口脚本保存Django多个模型实例只保存上次迭代中创建的实例

考虑下面的代码:

def populate(): 
    current_user = User.objects.get(username='testuser') 
    blogger_data = {'user': current_user,'bio':"this is my test bio", 'likes': 5,} 
    blogger = add_blogger(blogger_data) 

    print("Registered blogger : %s" %blogger.user) 
    for num in range(5): 
     post_data = {'author':current_user, 'title':"test title %s"%num, 'description': "test description%s"%num, 'content': "test content%s"%num,} 
     posted_date = datetime.datetime.today() + datetime.timedelta(days=1) 
     post = add_post(post_data,num,posted_date) 
     comment_data = {'author':current_user, 'post':post,'content':"test content %s"%num, 'upvotes':num, 'downvotes':5-num,} 
     comment = add_comment(comment_data) 
     response_data = {'author':current_user, 'comment':comment, 'content':"test response %s"%num, 'upvotes':5-num, 'downvotes':num,} 
     response = add_response(response_data) 
     print("Saved post : %s, comment: %s, response: %s..." %(post,comment,response)) 
    print("Script succesfully saved data!") 

def add_post(data_dict,views, posted_date): 
    post = Post.objects.get_or_create(author=data_dict['author'])[0] 
    post.title = data_dict['title'] 
    post.description = data_dict['description'] 
    post.content = data_dict['content'] 
    post.views = views 
    post.posted_date = posted_date 
    post.save() 
    return post 

def add_comment(data_dict): 
    c = Comment.objects.get_or_create(author=data_dict['author'],post=data_dict['post'])[0] 
    c.content = data_dict['content'] 
    c.upvotes = data_dict['upvotes'] 
    c.downvotes = data_dict['downvotes'] 
    c.save() 
    return c 

def add_response(data_dict): 
    r = Response.objects.get_or_create(author=data_dict['author'],comment=data_dict['comment'])[0] 
    r.content = data_dict['content'] 
    r.upvotes = data_dict['upvotes'] 
    r.downvotes = data_dict['downvotes'] 
    r.save() 
    return r 

def add_blogger(data_dict): 
    blogger = Blogger.objects.get_or_create(user=data_dict['user'])[0] 
    blogger.bio = data_dict['bio'] 
    blogger.likes = data_dict['likes'] 
    blogger.save() 
    return blogger 

if __name__=='__main__': 
    print("Starting Blog population script...") 
populate() 

型号:

class Post(models.Model): 
    author = models.ForeignKey(User) 
    title = models.CharField(max_length=64, help_text="The post's title.", unique=True) 
    description = models.CharField(max_length=128, help_text="A short description of the post.") 
    content = models.CharField(max_length=8192, help_text="Your post content.") 
    views = models.IntegerField(default=0) 
    slug = models.SlugField(blank=True) 
    created_date = models.DateField(default=timezone.now) 
    posted_date = models.DateField(blank=True,null=True) 


    def __str__(self): 
     return self.title 

    def save(self, *args, **kwargs): 
     self.slug = slugify(self.title) 
     if not self.posted_date: 
      self.posted_date = datetime.today() 
     super(Post, self).save(*args, **kwargs) 

class Comment(models.Model): 
    author = models.ForeignKey(User) 
    post = models.ForeignKey(Post) 
    content = models.CharField(max_length=1024) 
    upvotes = models.IntegerField(default=0) 
    downvotes = models.IntegerField(default=0) 

    def __str__(self): 
     return "%s (%s)(%s)"%(self.content[:20]+"...",self.post,self.author) 

class Response(models.Model): 
    author = models.OneToOneField(User,primary_key=True) 
    comment= models.ForeignKey(Comment, models.SET_NULL, blank=True, null=True) 
    content = models.CharField(max_length=1024, help_text="Your message in response to a desired comment.") 
    upvotes = models.IntegerField(default=0) 
    downvotes = models.IntegerField(default=0) 

    def __str__(self): 
     return "%s (%s)(%s)" % (self.content[:20]+"...",self.author,self.content) 

class Blogger(models.Model): 
    user = models.OneToOneField(User, primary_key=True) 
    bio = models.CharField(max_length=1024, help_text="A short bio that viewers can see about you.") 
    profilepic = models.ImageField(upload_to='profilepics') 
    likes = models.IntegerField(default=0) 
    joined_date = models.DateField(default=datetime.today) 

    def __str__(self): 
     return user.username 

    def save(self, *args, **kwargs): 
     self.joined_date = timezone.now() 
     super(Blogger, self).save(*args, **kwargs) 

只运行在循环的最后一次迭代创建的模型实例被保存在数据库中的脚本之后。 实际发生了什么?

+0

您需要显示'add_post','add_comment'和'add_response'函数。发布模型也会有帮助。 –

+0

更新了帖子。 – ViorelD

回答

0

您只有一个用户,您在每次迭代中使用。这意味着您在Post上的get_or_create调用将在第一次迭代中为该用户创建帖子,但在随后的每次迭代中都会获取现有实例并进行更新。随后对其余功能的调用将执行相同的操作,因为它们依次通过Post和Comment。

相关问题