【发布时间】:2019-01-21 21:47:57
【问题描述】:
我正在尝试在 Django 中为租赁合同建模并使用管理表单来插入和修改它。 业主和租户都可以是公司(增值税号)或个人(无增值税号)。公司和个人存储在两种不同的模型中(公司和个人)。
我正在尝试使用通用外键解决这个问题,但我无法在管理页面中显示租户名称,只有一个整数字段根本不友好。
gestimm 是应用程序的名称,这是我过于简化的模型:
# my gestimm/models.py
#
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
class Individual(models.Model):
name = models.CharField(max_length=100, help_text='Name')
def __str__(self):
return self.name
class Company(models.Model):
name = models.CharField(max_length=100, help_text='Name')
def __str__(self):
return self.name
class Contract(models.Model):
description = models.CharField(max_length=30)
start = models.DateField()
stop = models.DateField()
def __str__(self):
return self.description
class Tenant(models.Model):
limit = models.Q(app_label='gestimm', model='individual') | models.Q(app_label='gestimm', model='company')
contract = models.ForeignKey(Contract, on_delete=models.CASCADE,
null=True, blank=True)
content_type = models.ForeignKey(ContentType, on_delete=models.PROTECT,
help_text='Tenant', null=True,
limit_choices_to=limit)
object_id = models.PositiveIntegerField(null=True)
tenant = GenericForeignKey('content_type', 'object_id')
我是如何解决这个问题的:
# my gestimm/admin.py
#
from django.contrib import admin
from .models import Individual, Company, Contract, Tenant
class TenantInline(admin.StackedInline):
model = Tenant
extra = 1
class ContractAdmin(admin.ModelAdmin):
inlines = [TenantInline]
admin.site.register(Individual)
admin.site.register(Company)
admin.site.register(Contract, ContractAdmin)
我发现了一些旧的讨论,但没有一个提议的解决方案奏效。
【问题讨论】:
标签: django django-models django-admin