Как назначить несколько моделей в одной модели с внешним ключом в качестве родительской модели [ проектирование баз данных ]

У меня есть 3 отдельные модели

1. InitialBills
    id uuid
    name varchar

2. CurrentBills
    id uuid
    name varchar

3. BillPaymentInfo
    id uuid
    name varchar

Теперь у меня есть еще одна таблица, которая является таблицей вложений документов

BillPaymentDocument
    id uuid
    biil_data FK [ models either from InitialBills, currentBill or BillPaymentInfo ]
    doc_name varchar
    doc_type choice field

I want it to be like 

BillPaymentDocument
       project = models.ForeignKey(InitialBills,currentBill,BillPaymentInfo   on_delete=models.SET_NULL, blank=False, null=True,
                                related_name='bill_payment_detail')

Я не хочу выделять отдельную таблицу для этого, как я могу это сделать???

В Django вы можете использовать общий внешний ключ для связи одной таблицы с одной из многих.

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType



class InitialBills(models.Model):
    uuid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)


class CurrentBills(models.Model):
    uuid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)


class BillPaymentInfo(models.Model):
    uuid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)


class BillPaymentDocument(models.Model):
    uuid = models.AutoField(primary_key=True)

    # content_type tells Django which model this object will link to
    content_type = models.ForeignKey(
        ContentType, 
        limit_choices_to = {
            "model__in": ('InitialBills', 'CurrentBills', 'BillPaymentInfo')
        },
        on_delete=models.CASCADE
    )
    # object_id is the id of the object in the linked model
    object_id = models.PositiveIntegerField(null=False)
    # this is the actual foreign key object itself, rather than the id
    project = GenericForeignKey("content_type", "object_id")
    
    # ... then add some more fields if you wish ...
    document_name = models.CharField(max_length=255)

# Now you need to add the relation manually onto the FK'ed models, 
# as Django doesn't do this for you, 
# in case you ever want to query this relationship backwards
InitialBills.add_to_class("bill_payment_documents", GenericRelation('BillPaymentDocument', content_type_field='content_type', object_id_field='object_id'))
CurrentBills.add_to_class("bill_payment_documents", GenericRelation('BillPaymentDocument', content_type_field='content_type', object_id_field='object_id'))
BillPaymentInfo.add_to_class("bill_payment_documents", GenericRelation('BillPaymentDocument', content_type_field='content_type', object_id_field='object_id'))

Поля content_type и object_id предназначены скорее для внутреннего использования Django. Чаще всего в коде вы будете ссылаться на content_object, так как это эквивалент поля ForeignKey для данного случая использования.

Вернуться на верх