Вы действительно можете сделать try/catch
, как продемонстрировал Тим, и это сработает.Если вы обнаружите, что в некоторых случаях вы начинаете фильтровать больше полей или что вы хотите разумного значения по умолчанию, вы можете сделать так, как предлагают документы, и использовать метод get_or_create()
, например:
sp, created = SongProfile.objects.get_or_create(user=request.user)
Из документов :
Все аргументы ключевого слова, переданные get_or_create () - кроме необязательного, называемого defaults - будут использоваться в вызове get ().Если объект найден, get_or_create () возвращает кортеж этого объекта и False.Если объект не найден, get_or_create () будет создавать экземпляр и сохранять новый объект, возвращая кортеж нового объекта и значение True.
Таким образом, логическое значение указывает, нужно ли создавать объект илинет, и вы можете использовать его для управления логикой метода.
Этот синтаксис также немного короче и чище.
Что касается попыток сохранить как Song
, так и SongProfile
,нет, ты не ошибаешьсяКак продемонстрировал Тим, form.save()
создает новые song
и songprofile.song = song
, за которыми следует songprofile.save()
, сохраняет ссылку на песню songprofile
.
В паре есть несколько небольших ошибок.пример кодаОдна ошибка,
if songprofile = null:
...
, которая, как вы заметили в @Natim, должна была использоваться,
if songprofile is None:
...
Другая проблема в строке,
sp = SongProfile
который Python действительно будет компилировать, но который назначает ссылку на объект класса SongProfile
на переменную, а не на экземпляр самого класса.То, что вы хотите сделать обычно, будет
sp2 = SongProfile()
, и это создаст экземпляр объекта.Если вы сделаете dir(sp)
и dir(sp2)
, вы увидите разницу.