Django 如何更改对象的子类

Django 如何更改对象的子类,django,django-models,Django,Django Models,我有一个由另外两个模型继承的基础模型。如何在保持采购关系不变的情况下,将投标对象更改为报价对象?我的目的是将投标转换为按需报价 class Procurement(models.Model): pass class ProcurementRow(models.Model) procurement = models.ForeignKey(Procurement) class Tender(Procurement): pass class OfferRequest(Pr

我有一个由另外两个模型继承的基础模型。如何在保持采购关系不变的情况下,将投标对象更改为报价对象?我的目的是将投标转换为按需报价

class Procurement(models.Model):
    pass

class ProcurementRow(models.Model)
    procurement = models.ForeignKey(Procurement)

class Tender(Procurement):
    pass

class OfferRequest(Procurement):
    pass

您可以在
采购
的字段上循环,然后使用getattr/setattr复制字段。我还建议你通过一个
ForeignKeyField
在两者之间建立一种牢固的关系,这样你就可以了解事情是如何发生的

class Tender(Procurement):
    pass

class OfferRequest(Procurement):
    tender = models.ForeignKey(Tender)

    @classmethod
    def from_tender(cls, tender):
        instance = cls()
        instance.tender = tender
        for field in Procurement._meta.fields:
            if field.auto_created:
                continue
            setattr(
                instance,
                field.name,
                getattr(tender, field.name, None)
            )
        instance.save()
        return instance

tender = Tender.objects.first()
offer_request = OfferRequest.from_tender(tender)

我已经解决了原始sql查询的问题

def convert_procurement(request, procurement_id):
    procurement = get_object_or_404(Procurement, id=procurement_id).parent()
    from django.db import connection
    with connection.cursor() as cursor:
        if isinstance(procurement, Tender):
            cursor.execute("INSERT INTO procurement_offerrequest(procurement_ptr_id) VALUES (%s)", [procurement.id])
            cursor.execute("DELETE FROM procurement_tender WHERE procurement_ptr_id=(%s)", [procurement.id])
            return redirect('procurement:create_offer_request', procurement.id)
        elif isinstance(procurement, OfferRequest):
            cursor.execute("INSERT INTO procurement_tender(procurement_ptr_id) VALUES (%s)", [procurement.id])
            cursor.execute("DELETE FROM procurement_offerrequest WHERE procurement_ptr_id=(%s)", [procurement.id])

            return redirect('procurement:create_tender', procurement.id)

当你说“将投标对象更改为报价对象”是什么意思?“按需”将投标转换为报价是什么意思?当我将投标对象转换为报价对象时,必须创建一个新的报价对象,并且采购对象的所有数据都应传输到新对象。我所说的随需应变是指,这应该是一个编程解决方案,用户只需点击一个按钮就可以实现这一点。我可以看到实例正在创建中,但并没有保存到数据库中。django是不是为了我们的正直而在背后牵线搭桥?