【问题标题】:Populate Django database(SQL)填充 Django 数据库(SQL)
【发布时间】:2021-06-20 20:23:56
【问题描述】:

我正在学习 Django,对我来说有点困难,所以我在使用 Fields M2M、OTO、FK 时遇到了一些问题,我被卡住了,我正在尝试填写数据库(SQL),一切似乎都正常,但是有一个中间字段

    authors = models.ManyToManyField(Author)

book_authors这个表是空的,阅读文档,没有帮助:p

models.py

    from django.db import models
    
    
    class Author(models.Model):
        name = models.CharField(max_length=100)
        age = models.IntegerField()
    
    
    class Publisher(models.Model):
        name = models.CharField(max_length=300)
    
    
    class Book(models.Model):
        name = models.CharField(max_length=300)
        pages = models.IntegerField()
        price = models.DecimalField(max_digits=10, decimal_places=2)
        rating = models.FloatField()
        authors = models.ManyToManyField(Author)
        publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
        pubdate = models.DateField('date published')
    
    
    class Store(models.Model):
        name = models.CharField(max_length=300)
        books = models.ManyToManyField(Book)

admin.py

    from django.contrib import admin
    from annotate_aggregate.models import Author, Publisher, Store, Book
    
    admin.site.register(Author)
    admin.site.register(Publisher)
    admin.site.register(Book)
    admin.site.register(Store)

管理/命令/seed.py

import random
from django.utils import timezone
from annotate_aggregate.models import Author, Book, Store, Publisher
from django.core.management.base import BaseCommand
from faker import Faker

fake = Faker()


class Command(BaseCommand):
    def add_arguments(self, parser):
        parser.add_argument('arg', type=int)

    def handle(self, *args, **options):
        num = options['arg']

        for _ in range(int(num)):
            Author.objects.create(name=fake.name(), 
    age=random.randint(20, 70))

        for _ in range(int(num)):
            Publisher.objects.create(name=fake.company())

            for publisher in Publisher.objects.all():
                for _ in range(int(num)):
                    books = [Book(
                        name=fake.sentence(),
                        price=random.uniform(29.99, 225.9),
                        pages=random.randint(50, 300),
                        rating=round(random.uniform(1, 5), 2),
                        pubdate=timezone.now(),
                        publisher=publisher)]
                    Book.objects.bulk_create(books)
        books = Book.objects.all()
        for _ in range(int(num)):
            store = Store.objects.create(name=fake.company())
            store.books.set(books)
            store.save()

enter image description here

【问题讨论】:

  • 您永远不会将作者添加到您附加到出版商的书中。循环浏览书籍并为每本书添加一个随机作者。
  • @AMG 是的,我明白这一点,但我不知道它是如何在我的代码中修复的。

标签: python sql django


【解决方案1】:

您可以循环浏览您创建的书籍并为每本书添加一个作者。

类似以下的内容会遍历您的所有书籍,并为每本书添加一个随机作者。在您已经在authors = [Author(name=fake.name(), age=random.randint(20, 70)) for _ in range(1, 6)] 行中创建的作者列表中使用random.choice。我没有对此进行测试,但我认为它应该很接近。

import random

for book in Book.objects.all():
    book.authors.add(random.choice(authors))

【讨论】:

    猜你喜欢
    • 2021-02-01
    • 2019-01-17
    • 1970-01-01
    • 2011-08-29
    • 2010-12-25
    • 2019-05-02
    • 2015-07-31
    • 2013-06-02
    • 1970-01-01
    相关资源
    最近更新 更多