Django.db.utils.ProgrammingError:关系“订阅计划”不存在

2024-09-30 05:26:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用django admin&;壳我正在尝试制作订阅模型。计划模型通过计划服务模型具有多个服务。但是有点不对劲

你能帮我查一下吗

帮助我改进型号

控制台错误:

>>> p1 = Plan(code='PR', description='Premium', price=60000, tax=0)
>>> p1.save()
Traceback (most recent call last):
  File "/home/xmedinavei/Desktop/version_project/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.UndefinedTable: relation "subscriptions_plan" does not exist
LINE 1: UPDATE "subscriptions_plan" SET "status" = '(''Activo'', ''A...
               ^


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/xmedinavei/Desktop/version_project/venv/lib/python3.8/site-packages/django/db/models/base.py", line 745, in save
    self.save_base(using=using, force_insert=force_insert,
  File "/home/xmedinavei/Desktop/version_project/venv/lib/python3.8/site-packages/django/db/models/base.py", line 782, in save_base
    updated = self._save_table(
  File "/home/xmedinavei/Desktop/version_project/venv/lib/python3.8/site-packages/django/db/models/base.py", line 864, in _save_table
    updated = self._do_update(base_qs, using, pk_val, values, update_fields,
  File "/home/xmedinavei/Desktop/version_project/venv/lib/python3.8/site-packages/django/db/models/base.py", line 917, in _do_update
    return filtered._update(values) > 0
  File "/home/xmedinavei/Desktop/version_project/venv/lib/python3.8/site-packages/django/db/models/query.py", line 771, in _update
    return query.get_compiler(self.db).execute_sql(CURSOR)
  File "/home/xmedinavei/Desktop/version_project/venv/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1500, in execute_sql
    cursor = super().execute_sql(result_type)
  File "/home/xmedinavei/Desktop/version_project/venv/lib/python3.8/site-packages/django/db/models/sql/compiler.py", line 1152, in execute_sql
    cursor.execute(sql, params)
  File "/home/xmedinavei/Desktop/version_project/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 100, in execute
    return super().execute(sql, params)
  File "/home/xmedinavei/Desktop/version_project/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 68, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/home/xmedinavei/Desktop/version_project/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/home/xmedinavei/Desktop/version_project/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
  File "/home/xmedinavei/Desktop/version_project/venv/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/xmedinavei/Desktop/version_project/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: relation "subscriptions_plan" does not exist
LINE 1: UPDATE "subscriptions_plan" SET "status" = '(''Activo'', ''A...

utils.py

# Django
from django.db import models

class BaseVersionPlusModel(models.Model):
    '''This handle the base model for all project app models of the project.'''
    
    AC = "Activo"
    IN = "Inactivo"
    STATUS_CHOICES = (
        (AC, "Activo"),
        (IN, "Inactivo"),
    )
    status = models.CharField(max_length=14, 
                              choices=STATUS_CHOICES,
                              default=STATUS_CHOICES[0])
    created_at = models.DateField(auto_now_add=True)
    modified_at = models.DateField(auto_now=True)

    class Meta:
        abstract = True

服务/型号.py

# Models
from versionplus.utils import BaseVersionPlusModel

class Service(BaseVersionPlusModel):
    '''We can handle all the services available for suscriptions.'''

    code = models.CharField(max_length=17,
                            primary_key=True)
    name = models.CharField(max_length=100)
    cost = models.FloatField()
    price = models.FloatField()
    store = models.CharField(max_length=255)

订阅/models.py

'''Suscription app models.'''

# Django
from django.db import models
from django.core.exceptions import ValidationError

# Models
from versionplus.utils import BaseVersionPlusModel
from services.models import Service
from partners.models import Partner
from services.models import Service
from products.models import Product


class Plan(BaseVersionPlusModel):
    '''
    Model that handle the plans available for the clients.
    Period of suscription can be choosed.
    A Plan can be set active or inactive.
    Services can be added as many as wanted.
    '''
    M = "Mensual"
    B = "Bimensual"
    T = "Trimestral"
    PERIOD_CHOICES = (
        (M, "Mensual"),
        (B, "Bimensual"),
        (T, "Trimestral"),
    )
    code = models.CharField(max_length=17, 
                            primary_key=True)
    description = models.CharField(max_length=255)
    period = models.CharField(max_length=14, 
                              choices=PERIOD_CHOICES, 
                              null=True,
                              default=PERIOD_CHOICES[0])
    services = models.ManyToManyField(Service, 
                                      through='PlanService', 
                                      blank=True)
    price = models.FloatField()
    tax = models.FloatField()

    def get_services(self):
        return "\n".join([p.name for p in self.services.all()])


class PlanService(BaseVersionPlusModel):
    '''
    This is the service model linked to the Plan.
    The service limit usage can be added here.
    Handle the service used counter and service remaining counter.

    A Plan can have multiple services throught this model.
    '''
    service = models.ForeignKey(Service, 
                                on_delete=models.CASCADE)
    plan = models.ForeignKey(Plan,
                             related_name='plan_services', 
                             on_delete=models.CASCADE)
    consume = models.ForeignKey('Consume',
                                on_delete=models.CASCADE, 
                                blank=True)
    limit = models.FloatField(default=9999)

    def consume_counter(self):
        '''Check consume_counter.'''
        return self.consume.all().count()


class Consume(BaseVersionPlusModel):
    '''This is the consumption log of the PlanService model.'''
    pass

    def __str__(self):
        return f'Consumed: {created_at}'
        

class Subscription(BaseVersionPlusModel):
    '''
    Suscription is the model associated to the suscription available and the partner client.
    '''
    partner = models.ForeignKey(Partner,
                                related_name='subscription_partner', 
                                on_delete=models.PROTECT, 
                                blank=True)
    plan = models.ForeignKey('Plan',
                             related_name='subscription_partner',
                             on_delete=models.PROTECT, 
                             blank=True, null=True)
    payment_date = models.DateField()
    renovate = models.DateField()
 

Tags: thedjangoinpyprojecthomeexecutedb

热门问题