Модели Django: выберите FK из двух вариантов (только один)

#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 в некотором смысле и наоборот. Я думаю, это вам поможет.