Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

248
Views
Cambiar el nombre de un modelo de superclase de Django y actualizar los punteros de subclase correctamente

Tengo problemas para refactorizar una superclase en Django v2.2.12 que involucra tres modelos, con un modelo de superclase y dos modelos de subclase:

 class BaseProduct(models.Model): name = models.CharField() description = models.CharField() class GeneralProduct(BaseProduct): pass class SoftwareProduct(BaseProduct): pass

El modelo BaseProduct debe cambiarse de nombre a solo Product , así que cambié este código a:

 class Product(models.Model): name = models.CharField() description = models.CharField() class GeneralProduct(Product): pass class SoftwareProduct(Product): pass

Y luego ejecutó python manage.py makemigrations , en el que Django parece ver correctamente qué cambió:

 Did you rename the yourapp.BaseProduct model to Product? [y/N] y Did you rename generalproduct.baseproduct_ptr to generalproduct.product_ptr (a OneToOneField)? [y/N] y Did you rename softwareproduct.baseproduct_ptr to softwareproduct.product_ptr (a OneToOneField)? [y/N] y Migrations for 'yourapp': .../yourapp/migrations/002_auto_20200507_1830.py - Rename model BaseProduct to Product - Rename field baseproduct_ptr on generalproduct to product_ptr - Rename field baseproduct_ptr on softwareproduct to product_ptr

Hasta aquí todo bien. Django ve que se cambió el nombre de la superclase, y sabe que sus propios valores ..._ptr autogenerados que usa para rastrear la herencia del modelo también deben actualizarse en la base de datos.

La migración resultante que se le ocurre parece tan concisa como debería ser:

 # Generated by Django 2.2.12 on 2020-05-07 18:30 from django.db import migrations class Migration(migrations.Migration): dependencies = [ ('yourapp', '0001_initial'), ] operations = [ migrations.RenameModel( old_name='BaseProduct', new_name='Product', ), migrations.RenameField( model_name='generalproduct', old_name='baseproduct_ptr', new_name='product_ptr', ), migrations.RenameField( model_name='softwareproduct', old_name='baseproduct_ptr', new_name='product_ptr', ), ]

Todo parece perfecto, pero aplicar esa migración usando python manage.py migrate falla:

 Running migrations: Applying yourapp.0002_auto_20200507_1830...Traceback (most recent call last): [...] File ".../python3.7/site-packages/django/db/migrations/executor.py", line 245, in apply_migration state = migration.apply(state, schema_editor) File ".../python3.7/site-packages/django/db/migrations/migration.py", line 114, in apply operation.state_forwards(self.app_label, project_state) File ".../python3.7/site-packages/django/db/migrations/operations/models.py", line 340, in state_forwards state.reload_models(to_reload, delay=True) File ".../python3.7/site-packages/django/db/migrations/state.py", line 165, in reload_models self._reload(related_models) File ".../python3.7/site-packages/django/db/migrations/state.py", line 191, in _reload self.apps.render_multiple(states_to_be_rendered) File ".../python3.7/site-packages/django/db/migrations/state.py", line 308, in render_multiple model.render(self) File ".../python3.7/site-packages/django/db/migrations/state.py", line 579, in render return type(self.name, bases, body) File ".../python3.7/site-packages/django/db/models/base.py", line 253, in __new__ base.__name__, django.core.exceptions.FieldError: Auto-generated field 'baseproduct_ptr' in class 'SoftwareProduct' for parent_link to base class 'BaseProduct' clashes with declared field of the same name.

Busqué en la web ese error, así como para cambiar el nombre de un modelo de Django que es una superclase para otros modelos, pero no parece haber ninguna documentación (detectable), publicaciones de blog o respuestas de SO que hablen sobre este problema.

over 4 years ago · Santiago Trujillo
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!