Пользовательская модель пользователя, имеющая 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