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