Проблемы с пониманием того, как Django save () обрабатывает * args - PullRequest
0 голосов
/ 21 декабря 2018

Вчера боролся с проблемой импорта картинок из URL в модель Django.Был в состоянии придумать рабочее решение, но до сих пор не знаю, как это работает.Как save func знает, какие * аргументы он может обработать и в каком порядке?Потому что, когда я поменял местами объект изображения и имя файла, он не работал TypeError: join() argument must be str or bytes, not 'File'.Не могу понять это, читая документы - https://docs.djangoproject.com/en/2.1/_modules/django/db/models/base/#Model.save. Сценарий ниже помещает имена игроков НХЛ, их идентификаторы и фотографии профиля в мою модель игрока.Любая помощь?

файл команд:

import urllib.request as urllib
import requests

from django.core.management.base import BaseCommand, CommandError
from django.core.files import File

from players.models import Player


URL_PLAYERS = 'http://www.nhl.com/stats/rest/{}'
URL_PICS = 'https://nhl.bamcontent.com/images/headshots/current/168x168/{}.jpg'


class Command(BaseCommand):

    def import_player(self, data):
        id_ = data["playerId"]
        content = urllib.urlretrieve(URL_PICS.format(id_))
        pic = File(open(content[0], 'rb'))  # do I need to close the file here?
        file = f'{data["playerName"]}.jpg'
        player = Player(name=data["playerName"], nhl_id=id_)
        player.save()
        player.image.save(file, pic)


    def handle(self, *args, **options):

        params = {"isAggregate": "false",
                  "reportType": "basic",
                  "isGame": "false",
                  "reportName": "skaterpercentages",
                  "cayenneExp": "gameTypeId=2 and seasonId=20182019"}

        response = requests.get(url=URL_PLAYERS.format("skaters"),
                                params=params)

        response.raise_for_status()
        data = response.json()["data"]

        for player in data:
            self.import_player(player)

файл моделей:

from django.db import models

class Player(models.Model):
    name = models.CharField(max_length=128)
    nhl_id = models.IntegerField()  #(unique=True)
    image = models.ImageField(default='default.jpg', upload_to='players_pics')

    def __str__(self):
        return f'{self.name}'

1 Ответ

0 голосов
/ 03 апреля 2019

Просто чтобы не оставить вопрос без ответа.Как @Daniel Roseman предложил, я перепутал два разных метода.На самом деле использовался метод сохранения FileField , но мне показалось, что я использовал Model.save метод .Итак, искал не ту документацию.

...