【问题标题】:How to customize related_name argument in Django如何在 Django 中自定义related_name 参数
【发布时间】:2019-02-06 17:39:26
【问题描述】:

我有一个抽象模型和两个子模型,例如:

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)

现在子模型的反向名称将是 saleinvoicespurchaseinvoices。但我需要的是sale_invoicespurchase_invoices。如何做到这一点? CamelCase 之间的下划线。

【问题讨论】:

    标签: python django python-3.x django-models django-forms


    【解决方案1】:
    1. 覆盖 ForeignKeycontribute_to_class() 以设置 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__))


    2. 在抽象模型中使用这个自定义外键字段

    class Invoice(models.Model):
        user = CustomFk(User, related_name='%(class)s')
    
        class Meta:
            abstract = True



    # 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,
            },
        ),
    ]

    参考
    *。 contribute_to_class()
    *。 Split string with uppercase letters- Python

    【讨论】:

      猜你喜欢
      • 2013-10-29
      • 1970-01-01
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 2011-02-05
      相关资源
      最近更新 更多