import os import random import sys import tempfile import django # 配置 Django 环境 sys.path.append(os.path.dirname(os.path.abspath(__file__))) os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings") # 修改为你的 settings 路径 django.setup() # 2. 导入 Faker 和 模型 from faker import Faker from article.models import Article, ArticleAttachment from base.models import MainMenu from users.models import User from django.core.files import File # 引入 Django 的文件处理类 fake = Faker('zh_CN') def seed_articles(count=20): print(f"🚀 开始生成 {count} 篇文章...") subsections = list(MainMenu.objects.filter(parent__isnull=False, visible=True)) users = list(User.objects.all()) if not subsections: print("❌ 错误:数据库中没有找到任何子板块!") return if not users: print("⚠️ 警告:数据库中没有用户,作者将设为空。") created_count = 0 for i in range(count): section = random.choice(subsections) author = random.choice(users) if users else None # --- 2. 构建丰富的 HTML 内容 --- html_parts = [] # A. 开头:一段引言或摘要 if random.random() > 0.5: html_parts.append(f"

【摘要】 {fake.sentence(nb_words=10)}

") # B. 正文第一段 html_parts.append(f"

{fake.paragraph(nb_sentences=4)}

") # C. 随机插入图片占位符 (模拟上传的封面或插图) # 使用 placehold.co 生成带文字的灰色占位图 img_width = random.choice([600, 800]) img_height = random.choice([300, 400]) img_text = fake.words(nb=3, unique=True) html_parts.append( f'
') # D. 正文中间段落 html_parts.append(f"

{fake.paragraph(nb_sentences=5)}

") # E. 随机插入引用块 (增加排版层次感) if random.random() > 0.6: quote = fake.sentence(nb_words=8) html_parts.append( f'
"{quote}"
') # F. 随机插入无序列表 (模拟要点陈述) if random.random() > 0.7: list_items = "".join([f"
  • {fake.sentence()}
  • " for _ in range(3)]) html_parts.append(f"") # G. 加粗和斜体混合段落 p1 = fake.paragraph(nb_sentences=2) p2 = fake.paragraph(nb_sentences=2) html_parts.append(f"

    {p1} {fake.words(nb=4, unique=True)} {p2}

    ") # H. 结尾 html_parts.append(f"

    {fake.paragraph(nb_sentences=3)}

    ") # 拼接最终 HTML content_html = "\n".join(html_parts) article = Article.objects.create( title=fake.sentence(nb_words=random.randint(5, 10))[:-1], section=section, author=author, content=content_html, is_published=True, ) # --- 生成真实附件 --- if random.random() < 0.3: fake_filename = f"附件资料_{fake.word()}.pdf" # 创建临时文件 with tempfile.NamedTemporaryFile(suffix='.pdf', delete=False) as tmp_file: tmp_file.write(b'%PDF-1.4 Fake PDF Content for Testing') tmp_file_path = tmp_file.name try: # 打开并保存 with open(tmp_file_path, 'rb') as f: # 关键点:使用 file.save 方法,这会触发文件上传机制 attachment = ArticleAttachment(article=article) attachment.file.save(fake_filename, File(f), save=True) print(f" - [{section}] {article.title} (含真实附件)") finally: # 删除临时文件 if os.path.exists(tmp_file_path): os.remove(tmp_file_path) else: print(f" - [{section}] {article.title}") created_count += 1 print(f"✅ 成功生成 {created_count} 篇文章!") if __name__ == "__main__": seed_articles(1200)