在makemigrations文件

时间:2017-12-11 20:49:40

标签: python django models

即使在阅读db_columnDjango' recomendations上的文档后,我也无法通过此功能获得所需的结果。

这是我的代码的一部分

class DefaultBaseModel(models.Model):
    slug = models.SlugField(primary_key=True, 
                            unique=True, 
                            null=False, 
                            blank=False)

class Bill(DefaultBaseModel):

class Payment(DefaultBaseModel):
    bill = models.OneToOneField(Bill, 
                                related_name='payments', 
                                on_delete=models.CASCADE,
                                to_field='slug', 
                                db_column='bill_slug')

我期望在Django的shell上做以下几点:

from apps.bills.models import Payment
p = Payment.objects.first()
p.bill_slug

但是我得到了错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'Payment' object has no attribute 'bill_slug'

那么,

p.bill_id

给了我slug值,但它仍然在创建带有后缀_id的列。

  • 我尝试删除makemigrations(migrate)文件(那些initial.py和其他文件)并再次创建
  • 从Sqlite移至Postgres
  • 查看了Django的makemigrations文件和db_column =&#39; bill_slug&#39;在那里。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

有什么叫“branch_slug”的吗? Bill虽然有slug。在您的示例代码中,我在任何地方都看不到branch。尝试使用列和表名更简洁,看看它是否正常工作:

class DefaultBaseModel(models.Model):
    slug = models.SlugField(unique=True,)

    class Meta:
        abstract = True

class Bill(DefaultBaseModel):

class Payment(DefaultBaseModel):
    bill = models.OneToOneField(Bill, on_delete=models.CASCADE,)

现在这应该有效:

from apps.bills.models import Bill, Payment
b = Bill.objects.first()
b.slug

p = Payment.objects.first()
p.bill.slug