#python #django #web #django-models #backend
#python #django #веб #django-модели #серверная часть
Вопрос:
Это models.py из приложения по подписке. Некоторые поля были опущены для упрощения кода.
# PLAN
class Plan(BaseVersionPlusModel):
code = models.CharField(max_length=17,
primary_key=True)
description = models.CharField(max_length=255)
price = models.FloatField()
services = models.ManyToManyField(Service,
through='subscriptions.PlanService',
blank=True)
products = models.ManyToManyField(Product,
through='subscriptions.PlanProduct',
blank=True)
class PlanService(BaseVersionPlusModel):
service = models.ForeignKey(Service,
on_delete=models.CASCADE)
plan = models.ForeignKey(Plan,
related_name='plan_services',
on_delete=models.CASCADE)
limit = models.FloatField(default=9999)
class PlanProduct(BaseVersionPlusModel):
product = models.ForeignKey(Product,
on_delete=models.CASCADE)
plan = models.ForeignKey(Plan,
related_name='plan_products',
on_delete=models.CASCADE)
limit = models.FloatField(default=9999)
# SUBSCRIPTION
class Subscription(BaseVersionPlusModel):
client = models.ForeignKey(Client,
on_delete=models.PROTECT,
blank=True)
plan = models.ForeignKey(Plan,
on_delete=models.PROTECT,
blank=True,
null=True)
# CONSUME
class ServiceConsume(BaseVersionPlusModel):
subscription = models.ForeignKey(Subscription,
on_delete=models.CASCADE)
service = models.ForeignKey(Service,
on_delete=models.CASCADE)
class ProductConsume(BaseVersionPlusModel):
subscription = models.ForeignKey(Subscription,
on_delete=models.CASCADE)
product = models.ForeignKey(Product,
on_delete=models.CASCADE)
Я хотел бы получить модель потребления только в одной таблице вместо ServiceConsume и ProductConsume. Что-то вроде этого:
Class Consume(BaseVersionPlusModel):
subscription = models.ForeignKey(Subscription,
on_delete=models.CASCADE)
**service/product = FK(Service/Product) #But choosing only one**
Возможно ли это в Django?
Ответ №1:
Вы можете сделать так,
Class Consume(BaseVersionPlusModel):
subscription = models.ForeignKey(Subscription,
on_delete=models.CASCADE)
service = models.ForeignKey(Service,
on_delete=models.CASCADE, blank=True, null=True)
product = models.ForeignKey(Product,
on_delete=models.CASCADE,blank=True, null=True)
Здесь вы можете выбрать сервис или продукт. Продукт и сервис не являются обязательными для использования. В случае, если вы используете service, тогда вы можете игнорировать product в некотором смысле и наоборот. Я думаю, это вам поможет.