代码之家  ›  专栏  ›  技术社区  ›  Sreekanth Reddy Balne

如何在Django中自定义相关的\u name参数

  •  1
  • Sreekanth Reddy Balne  · 技术社区  · 6 年前

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

    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)
    

    现在,子模型的反向名称是 saleinvoices purchaseinvoices . 但我需要的是 sale_invoices purchase_invoices . 如何做到这一点?大小写之间的下划线。

    1 回复  |  直到 6 年前
        1
  •  3
  •   JPG    6 年前
    1. 覆盖 contribute_to_class() 属于 ForeignKey 相关名称
    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用这个 自定义FK字段 抽象模型。

    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