whi*_*hat 3 python django django-models django-forms python-3.x
我有一个抽象模型和两个子模型,例如:
class Invoice(models.Model):
user = models.ForeignKey("User", related_name='%(class)s')
class Meta:
abstract=True
class SaleInvoice(Invoice):
field_sale = models.CharField(max_length=255)
class PurchaseInvoice(Invoice):
field_purchase = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)
现在,子模型的反向名称将是saleinvoicesand purchaseinvoices。但我需要的是sale_invoices和purchase_invoices。如何实现这一目标?CamelCase 之间有一个下划线。
contribute_to_class()ofForeignKey以设置related_name。class CustomFk(models.ForeignKey):
def contribute_to_class(self, cls, name, private_only=False, **kwargs):
super().contribute_to_class(cls, name, private_only=False, **kwargs)
self.remote_field.related_name = "_".join(re.findall('[A-Z][^A-Z]*', cls.__name__))Run Code Online (Sandbox Code Playgroud)
2. 在抽象模型中使用此自定义 FK 字段。
class Invoice(models.Model):
user = CustomFk(User, related_name='%(class)s')
class Meta:
abstract = TrueRun Code Online (Sandbox Code Playgroud)
# migrations file
operations = [
migrations.CreateModel(
name='PurchaseInvoice',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('field_purchase', models.CharField(max_length=255)),
('user', sample.models.CustomFk(on_delete=django.db.models.deletion.CASCADE,
related_name='Purchase_Invoice', to=settings.AUTH_USER_MODEL)),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='SaleInvoice',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('field_sale', models.CharField(max_length=255)),
('user', sample.models.CustomFk(on_delete=django.db.models.deletion.CASCADE,
related_name='Sale_Invoice', to=settings.AUTH_USER_MODEL)),
],
options={
'abstract': False,
},
),
]Run Code Online (Sandbox Code Playgroud)
参考
*。
*。用大写字母分割字符串 - Pythoncontribute_to_class()
| 归档时间: |
|
| 查看次数: |
711 次 |
| 最近记录: |