django 中OneToOneField 与 inlines 配合使用

环境:django v2.0.4

需求:数据库设计使用2张表存储 Car 和 Engine,但是在 django admin 中需要在一个页面进行编辑。
django 中OneToOneField 与 inlines 配合使用_第1张图片

核心技术是StackedInline(纵向嵌入)/TabularInline(横向嵌入),这样就可以把相关 model组成一个编辑界面。

StackedInline与OneToOneField同时使用,代码如下:

#models.py
class Engine(models.Model):
    name = models.CharField(max_length=25)

    def __str__(self):
        return self.name

class Car(models.Model):
    name = models.CharField(max_length=25)
    engine = models.OneToOneField(Engine, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

# admin.py
class EngineAdmin(admin.StackedInline):
    model=Engine

@admin.register(Car)
class CarAdmin(admin.ModelAdmin):
    inlines = [EngineAdmin]

报错:

ERRORS:
<class 'cars.admin.CarAdmin'>: (admin.E202) 'cars.Car' has no ForeignKey to 'cars.Car'.

stackoverflow上的讨论:https://stackoverflow.com/questions/1744203/

按照上面帖子的方式还是不得行,并且给出了建议:

WARNINGS:
cars.Car2.engine: (fields.W342) Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.
    HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.

修改代码如下:

class Car3(models.Model):
    name = models.CharField(max_length=25)

    def __str__(self):
        return self.name

class Engine3(models.Model):
    name = models.CharField(max_length=25)
    car3 = models.ForeignKey(Car3, unique=True, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

基本满足效果,但是有警告:

WARNINGS:
cars.Car2.engine: (fields.W342) Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.
    HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.
cars.Engine3.car3: (fields.W342) Setting unique=True on a ForeignKey has the same effect as using a OneToOneField.
    HINT: ForeignKey(unique=True) is usually better served by a OneToOneField.

根据警告修改测试,基本满足要求。

此次的测试代码地址:https://gitee.com/enlangs/test_onetoone_field

附录:

  1. 官方文档说明:https://docs.djangoproject.com/zh-hans/2.0/topics/db/examples/one_to_one/
  2. OneTwoOneField 与 ForeignKey 有什么差异,这儿有个讨论帖:What’s the difference between django OneToOneField and ForeignKey?

你可能感兴趣的:(Python/Django,django,StackedInline,OneToOneField)