首页 > 解决方案 > (Django) (Factory Boy) (Errno 13) 权限被拒绝

问题描述

所以,我是 Django 的一个完整的初学者,并试图弄清楚如何用随机数据填充数据库。

当我尝试运行py manage.py setup_test_data时出现以下错误

    from seller.factories import *
  File "C:\Users\Suyash Singh\Desktop\SwaadBackend1\seller\factories.py", line 13, in <module>
    f = open(r"C:\Users\Suyash Singh\Desktop\SwaadBackend1\staticfiles\dish", 'r+')
PermissionError: [Errno 13] Permission denied: 'C:\\Users\\Suyash Singh\\Desktop\\SwaadBackend1\\staticfiles\\dish'
#factories.py

import factory
import faker
from faker import Faker
from factory.base import Factory
from factory.declarations import SubFactory
from factory.django import DjangoModelFactory
import random
from core.models import User
from seller.models import Dish, Restaurant

fake = Faker()

f = open(r"C:\Users\Suyash Singh\Desktop\SwaadBackend1\staticfiles\dish", 'r+')

f1 = open(r"C:\Users\Suyash Singh\Desktop\SwaadBackend1\staticfiles\logo", 'r+')


CATEGORIES = [
    "Sweets",
    "Rolls",
    "Kebabs",
    "Chaat",
    "Paneer",
    "Pizza",
    "Chicken",
    "Healthy",
    "Biryani",
    "Shawarma",
    "Thali",
    "Momos",
    "Burger",
    "Dal",
    'Dosa',
    "Chaap",
]

MEAL_TIME = [
    "Breakfast",
    "Lunch",
    "Dinner"
]

class Provider(faker.providers.BaseProvider):
    def dish_category(self):
        return self.random_element(CATEGORIES)
    
    def dish_meal_time(self):
        return self.random_element(MEAL_TIME)

fake.add_provider(Provider)

class DishFactory(DjangoModelFactory):
    class Meta:
        model = Dish

    photo = factory.django.ImageField(from_file= f, width=500, height=500)
    restaurant = factory.SubFactory('seller.factories.RestaurantFactory')
    price = random.randint(50, 600)
    title = factory.Faker('dish_category')
    veg = random.choice([True, False])
    category = factory.Faker('dish_category')
    meal_time = factory.Faker('dish_meal_time')

class RestaurantFactory(DjangoModelFactory):
    class Meta:
        model = Restaurant
    
    user = SubFactory('seller.factories.UserFactory')
    rest_name = factory.Faker('name')
    phone = fake.phone_number()
    address = fake.address()
    logo = factory.django.ImageField(from_file= f1, width=500, height=500)

class UserFactory(DjangoModelFactory):
    class Meta:
        model = User
    
    name = factory.Faker('name')
    email = factory.Faker('email')

    password = factory.PostGenerationMethodCall('set_password', 'test@123')

    is_active = True

f.close()
f1.close()
#setup_test_data.py

import random
from django.db import transaction
from django.core.management.base import BaseCommand
from core.models import User
from seller.models import Restaurant, Dish 
from seller.factories import *

class Command(BaseCommand):
    help = "Generate Test Data"

    def handle(self, *args, **kwargs):
        for _ in range(300):
            dish = DishFactory.create()
            print(dish.title)
            assert True
  1. 以前我尝试使用 from_path 并且发生了同样的错误。这次我使用 from_file ,因为我认为给予 r+ 权限可以修复错误。我如何解决它?

  2. 另外,在创建工厂时,我是否必须为每个模型字段分配假值,或者如果我没有指定字段,那么 Factory Boy 会自动为我做吗?

  3. 我使用了从我的餐厅模型到 Django 自定义用户模型的 OneToOne 字段。我创建工厂的方式正确吗?

标签: pythondjangofactory-boy

解决方案


推荐阅读