Как создать общие отношения без добавления зависимостей между приложениями в Django?
У меня есть приложение для магазина электронной коммерции, в котором есть такие приложения:
- ядро: специфическое приложение для магазина электронной коммерции.
- likes: независимое приложение многократного использования, которое должно использоваться с различными моделями из других приложений.
- store: независимое многоразовое приложение, которое имеет модели и представления для приложения электронной коммерции.
Теперь я хочу добавить возможность пользователю ставить лайк на товар, поэтому я хочу добавить лайк (из лайков) на товар (из магазина), как я могу сделать это без добавления явной зависимости (импорт лайков в магазин) между двумя приложениями?
Модель LikedItem
из likes app
:
from django.conf import settings
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes.fields import GenericForeignKey
class LikedItem(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey()
Модель из Product
: <<<3>> store app
>
class Product(models.Model):
title = models.CharField(max_length=255)
slug = models.SlugField()
description = models.TextField(null=True, blank=True)
unit_price = models.DecimalField(
max_digits=6,
decimal_places=2,
validators=[MinValueValidator(1)])
inventory = models.IntegerField(validators=[MinValueValidator(0)])
last_update = models.DateTimeField(auto_now=True)
collection = models.ForeignKey(
Collection, on_delete=models.PROTECT, related_name='products')
promotions = models.ManyToManyField(Promotion, blank=True)
def __str__(self) -> str:
return self.title
class Meta:
ordering = ['title']
Я попытался реализовать это в основном приложении, я начал с создания модели CustomProduct, которая расширяет модель Product и добавляет likes = GenericRelation(LikedItem)
, но все стало запутанным в части сериализатора, так как я не мог расширить сериализатор Product и добавить в него поле likes, и я почувствовал, что мне, возможно, нужно полностью реализовать модель Product только в основном приложении.