Как настроить аргумент related_name в Django - PullRequest
0 голосов
/ 31 августа 2018

У меня есть абстрактная модель и две дочерние модели, такие как:

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. Как этого добиться? Подчеркивание между CamelCase.

1 Ответ

0 голосов
/ 31 августа 2018
  1. переопределяет contribute_to_class() из ForeignKey, чтобы установить related_name .
class CustomFk(models.ForeignKey):
    <b>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__))</b>


2. Используйте это пользовательское поле FK в абстрактной модели.

class Invoice(models.Model):
    <b>user = CustomFk(User, related_name='%(class)s')</b>

    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,
                                            <b>related_name='Purchase_Invoice',</b> 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,
                                            <b>related_name='Sale_Invoice',</b> to=settings.AUTH_USER_MODEL)),
        ],
        options={
            'abstract': False,
        },
    ),
]

Ссылка
*. contribute_to_class()
*. Разделенная строка с заглавными буквами - Python

...