Пользовательская модель пользователя, имеющая ForeignKey к Customer с помощью dj-stripe

Я хотел бы иметь пользовательскую модель пользователя в моем django приложении, с колонкой для хранения ссылок на объекты Customer, поступающие из stripe, синхронизируемые через dj-stripe.

Так что мой подход заключался в следующем:

from django.contrib.auth.models import AbstractUser, UserManager
from django.db import models


class StripeUserModel(AbstractUser):
    objects = UserManager()
    customer = models.ForeignKey("djstripe.Customer", null=True, blank=True, on_delete=models.SET_NULL)

Установка стандартной модели django User на:

AUTH_USER_MODEL = "billing_stripe_app.StripeUserModel"

Когда я начинаю с чистой новой базы данных, удаляя файл SQLite и запуская python manage.py makemigrations, я наблюдаю следующую ошибку:

django.db.migrations.exceptions.CircularDependencyError: billing_stripe_app.0001_initial, djstripe.0001_initial, djstripe.0008_2_5, djstripe.0009_2_6, djstripe.0010_alter_customer_balance, djstripe.0011_2_7

Без поля customer в StripeUserModel все работает.

Интересно, как решить эту проблему. Я уже сталкивался с круговой зависимостью в Python. Это вполне логично. В моем приложении (billing_stripe_app) я ссылаюсь на поле клиента dj-stripe. И, очевидно, оно снова опирается на модель пользователя AUTH_USER_MODEL, создавая ту самую круговую зависимость, как видно из файла миграции djstripe 0001_initial.py (выдержка ниже).

...

DJSTRIPE_SUBSCRIBER_MODEL: str = getattr(
    settings, "DJSTRIPE_SUBSCRIBER_MODEL", settings.AUTH_USER_MODEL
)  # type: ignore

# Needed here for external apps that have added the DJSTRIPE_SUBSCRIBER_MODEL
# *not* in the '__first__' migration of the app, which results in:
# ValueError: Related model 'DJSTRIPE_SUBSCRIBER_MODEL' cannot be resolved
# Context: https://github.com/dj-stripe/dj-stripe/issues/707
DJSTRIPE_SUBSCRIBER_MODEL_MIGRATION_DEPENDENCY = getattr(
    settings, "DJSTRIPE_SUBSCRIBER_MODEL_MIGRATION_DEPENDENCY", "__first__"
)

DJSTRIPE_SUBSCRIBER_MODEL_DEPENDENCY = migrations.swappable_dependency(
    DJSTRIPE_SUBSCRIBER_MODEL
)

if DJSTRIPE_SUBSCRIBER_MODEL != settings.AUTH_USER_MODEL:
    DJSTRIPE_SUBSCRIBER_MODEL_DEPENDENCY = migrations.migration.SwappableTuple(
        (
            DJSTRIPE_SUBSCRIBER_MODEL.split(".", 1)[0],
            DJSTRIPE_SUBSCRIBER_MODEL_MIGRATION_DEPENDENCY,
        ),
        DJSTRIPE_SUBSCRIBER_MODEL,
    )

...

Есть идеи, как к этому подступиться? Если вы посмотрите это руководство на saaspegasus, то будет совершенно нормально пойти по пути расширения модели User с помощью ссылки на Customer.

Информация о версии: Django 4.1.6 dj-stripe 2.7.3 stripe 4.2.0 python 3.11

Вернуться на верх