簡體   English   中英

如何在Django中自定義related_name參數

[英]How to customize related_name argument in Django

我有一個抽象模型和兩個子模型,例如:

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之間的下划線。

  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.在抽象模型中使用此自定義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()
*。 用大寫字母分割字符串-Python

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM