Django - создание модели с круговой связью - от экземпляра к другому экземпляру?

В настоящее время я работаю над небольшим проектом. Интересуют две модели:

Склад

-BetweenWarehouseTransfers

Примечание: на каждом складе есть несколько товаров в разных моделях (которые являются продуктами);

Вопрос: Я хочу иметь возможность передавать товары с одного склада на другой. Для этого в BetweenWarehouseTransfers я хотел бы иметь одно поле, указывающее склад, на который я передаю товар (to_warehouse), и одно поле, указывающее, с какого склада этот товар поступает (from_warehouse). Позже я хотел бы добавить к этим двум полям поля автозаполнения, которые принимают в качестве входных данных только существующие склады

Есть ли у кого-нибудь идея, как создать эту круговую связь.

Я опубликовал пару решений, которые я себе представлял, но каждый раз возникает проблема круговой зависимости:

#0. (оригинальная версия)


from django.db import models
from django_extensions.db.models import TimeStampedModel

# from supply_chain.models.warehouse import Warehouse


class WarehouseTransferProductVariant(TimeStampedModel):

    product_variant = models.IntegerField()
    amount = models.IntegerField()

    to_warehouse_id = models.CharField(blank=False, max_length=255)
    from_warehouse_id = models.CharField(blank=False, max_length=255)

    StatusChoices = models.TextChoices(
        "StatusChoices", "SENTREQUEST ACCEPTED DECLINED CANCELLED"
    )

    status = models.CharField(blank=True, choices=StatusChoices.choices, max_length=255)

    # relation_from_to = models.ManyToManyField('warehouse.Warehouse', related_name="fromwarehouse_towarehouse")


class FromWarehouseTransferProductVariant(TimeStampedModel):
    warehouse = models.ForeignKey(Warehouse, on_delete=models.RESTRICT)
    from_warehouse = models.CharField(max_length=255)

class ToWarehouseTransferProductVariant(TimeStampedModel):
    warehouse = models.ForeignKey(Warehouse, on_delete=models.RESTRICT)
    to_warehouse = models.CharField(max_length=255)

    productvarariant = models.IntegerField()
    amount = models.IntegerField()


    StatusChoices = models.TextChoices(
        "StatusChoices", "SENTREQUEST ACCEPTED DECLINED CANCELLED"
    )

    status = models.CharField(blank=True, choices=StatusChoices.choices, max_length=255)


class WarehouseTransferProductVariant(TimeStampedModel):
    productvarariant = models.IntegerField()
    amount = models.IntegerField()

    to_warehouse = models.CharField(blank=False, max_length= 255)
    from_warehouse = models.CharField(blank=False, max_length= 255)

    StatusChoices = models.TextChoices(
        "StatusChoices", "SENTREQUEST ACCEPTED DECLINED CANCELLED"
    )

    status = models.CharField(blank=True, choices=StatusChoices.choices, max_length=255)


    to_warehouse_id = models.ForeignKey(Warehouse)
    from_warehouse_id = models.ForeignKey(Warehouse)
    type_of_relation = models.SmallPositiveIntegerField(choices=[(1,'from'), (2, 'to')])

Заранее спасибо.

Вот что бы я сделал:

class WarehouseTransferProduct(TimeStampedModel):
    product = models.ForeignKey('Product')
    to_warehouse = models.ForeignKey('Warehouse', related_name='to_warehouse')
    from_warehouse = models.ForeignKey('Warehouse', related_name='from_warehouse')
    amount = models.IntegerField()

    StatusChoices = models.TextChoices(
        "StatusChoices", "SENT REQUEST ACCEPTED DECLINED CANCELLED"
    ) #look https://stackoverflow.com/questions/18676156/how-to-properly-use-the-choices-field-option-in-django for status

    status = models.CharField(blank=True, choices=StatusChoices.choices, max_length=255)

1 трюк, который я узнал, чтобы избежать циклического импорта/отношений в Django, это

при использовании models.ForeignKey() пишите его как

models.ForeignKey('appname.modelname', related_name="related_name_of_your_pref")

или

models.ForeignKey('modelname', related_name="related_name_of_your_pref")

если обе модели находятся в одном и том же models.py

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