Django 2: не могу импортировать модели и сохранять их

Я почему-то не могу импортировать свои модели из другого приложения. Я уже смотрел и пробовал, но не работает.

events/models.py

class Registration(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    team = models.CharField(max_length=50, blank=True)
    date_created = models.DateTimeField(auto_now_add=True)

    def save(self, *args, **kwargs):
        payment = Payment.objects.create(registration=self)
        super().save(*args, **kwargs)

Когда я запускаю python manage.py makemigrations, я получаю это.

Ошибка

File "C:\Users\Rubber\ems\events\models.py", line 5, in <module>
   from payments.models import Payment   
File "C:\Users\Rubber\ems\payments\models.py", line 6, in <module>
   from events.models import Registration 
ImportError: cannot import name 'Registration'

платежи/models.py

import uuid

from django.db import models
from django.utils import timezone

from events.models import Registration  # THIS WONT WORK


def _create_uuid():
    return uuid.uuid1()

def _get_uuid():
    return _create_uuid()

class Payment(models.Model):
    uuid = models.CharField(max_length=1, default=_get_uuid)
    paid = models.BooleanField(default=False)
    registration = models.ForeignKey(Registration, on_delete=models.CASCADE)

Что я делаю не так?


person Franz    schedule 31.03.2018    source источник


Ответы (1)


У вас циклический импорт. В этом случае вы можете избежать этого, удалив импорт Registration и используя вместо него строку:

class Payment(models.Model):
    registration = models.ForeignKey('events.Registration', on_delete=models.CASCADE)

Другой вариант — переместить код Payment.objects.create() в сигнал. Обратите внимание, что ваш текущий метод save() создает Payment каждый раз при сохранении регистрации, а это может быть не то, что вам нужно.

person Alasdair    schedule 31.03.2018
comment
Я пробовал это раньше, теперь мне запрещается save() для предотвращения потери данных из-за несохраненной связанной регистрации объекта. - person Franz; 31.03.2018
comment
Просто перечитайте ошибку. Я переключаю super().save() и Payments.objects.create(). Работает. Спасибо за помощь. - person Franz; 31.03.2018