ai didi

python - 如何在 Django 中自定义 related_name 参数

转载 作者:太空宇宙 更新时间:2023-11-04 02:18:23 24 4
gpt4 key购买 nike

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

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):
<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()
*。 Split string with uppercase letters- Python

关于python - 如何在 Django 中自定义 related_name 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52119678/

24 4 0
文章推荐: javascript - 在服务器端编写 mongodb 更改的监听器
文章推荐: c - 这个错误在mingw中意味着什么?
文章推荐: node.js - 通过 Facebook 身份验证请求用户名时出错
文章推荐: c++ - C 中优雅的二进制 i/o?
太空宇宙
个人简介

我是一名优秀的程序员,十分优秀!

滴滴打车优惠券免费领取
滴滴打车优惠券
全站热门文章
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com