Ошибка Django "[object] instance with id X does not exist" при создании/обновлении внешнего ключа объекта в админке, используя фреймворк сайтов
У меня есть приложение Django, использующее фреймворк sites. У меня есть модель Category и модель Topic. Модель Topic имеет атрибут "category", указывающий на конкретный объект Category. Обе эти модели имеют атрибуты "site", связывающие их с определенными сайтами в приложении Django. Все эти сайты размещены на одном сервере.
Я заметил, что когда я создаю/обновляю объект (Тема) в админке - и устанавливаю поле внешнего ключа темы (категория) в категорию которая не находится на сайте, настроенном в параметре SITE_ID - я получаю следующее сообщение об ошибке:
экземпляр категории с id X не существует
Когда я изменяю SITE_ID
в settings.py
, я могу установить категорию темы в категорию на этом сайте , но не на других сайтах.
Вот диаграмма, которая поможет вам представить себе это:
Здесь есть две соответствующие модели, Категория и Тема:
class Category(models.Model):
name = models.CharField(max_length=128)
slug = models.SlugField()
description = RichTextUploadingField(
blank=True,
default='',
verbose_name='Category Description',
help_text='''Category description to be displayed on category page
goes here'''
)
site = models.ForeignKey(Site, on_delete=models.CASCADE)
on_site = CurrentSiteManager()
objects = models.Manager()
class Meta:
verbose_name_plural = 'categories'
ordering = ['name']
class Topic(models.Model):
site = models.ForeignKey(Site, on_delete=models.CASCADE)
name = models.CharField(max_length=128)
slug = models.SlugField()
description = RichTextUploadingField(
blank=True,
default='',
verbose_name='Topic Description',
help_text='''Topic description to be displayed on topic page
goes here'''
)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
on_site = CurrentSiteManager()
objects = models.Manager()
TopicAdmin настроен на получение категорий и тем для всех сайтов:
@admin.register(Topic)
class TopicAdmin(admin.ModelAdmin):
list_display = ['name', 'site']
save_as = True
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'category':
kwargs['queryset'] = Category.objects.all().order_by('name')
return super().formfield_for_foreignkey(db_field, request, **kwargs)
def get_queryset(self, request):
return Topic.objects.all()
Есть идеи, что можно сделать, чтобы темы сохранялись в соответствующей категории?
Я пытался подключиться к куче различных методов ModelAdmin, но пока не добился успеха.
Первый менеджер, определенный в модели, используется некоторыми частями Django, включая администратора, первый менеджер в ваших моделях - это CurrentSiteManager
, который ограничивает результаты текущим сайтом.
Поставьте обычный models.Manager
первым для каждой модели, чтобы используемый по умолчанию менеджер не был ограничен текущим сайтом
class Category(models.Model):
...
objects = models.Manager()
on_site = CurrentSiteManager()
class Topic(models.Model):
...
objects = models.Manager()
on_site = CurrentSiteManager()