Я пытаюсь смоделировать договор аренды в Джанго и использовать форму администратора, чтобы вставить и изменить его.
И владельцем, и арендатором могут быть компании (номер НДС) или физические лица (без номера НДС). Компании и частные лица хранятся в двух разных моделях (Компания и Физическое лицо).
Я пытаюсь решить эту проблему с помощью общего внешнего ключа, но не могу показать имя арендатора на странице администратора, только целочисленное поле, вообще не дружественное.
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)
Я нашел несколько старых обсуждений, но ни одно из предложенных решений не сработало.