Отношения между 2 моделями в Django - PullRequest
2 голосов
/ 14 апреля 2020

У меня есть две модели - Заказ и Расход. Расходы - это грубый список, соответствующий конкретному заказу. Как я могу установить такую ​​связь между этими двумя моделями?

models.py - Заказ

class Order(models.Model):

    user = models.ForeignKey(User,on_delete=models.CASCADE,related_name="order",blank=True,null=True)
    client_name = models.CharField(max_length=100)
    event_name = models.CharField(max_length=100)
    contact = models.CharField(max_length=15)
    event_date = models.DateField(auto_now_add=False,auto_now=False)
    expenses = models.IntegerField(default=0,null=True,blank=True)

Models.py - Расход

class ProjectExpense(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE,related_name="project_expense",null=True,blank=True)
    order_id = models.IntegerField(default='0')
    exp = models.CharField(max_length=100)
    exp_desc = models.TextField(null=True,blank=True)
    amount = models.IntegerField(default='0')

    def __str__(self):
        return self.exp

Я попытался присвоить полю Идентификатор заказа с текущим Заказом. Но как я смогу передать текущий приказ.

Ответы [ 2 ]

4 голосов
/ 14 апреля 2020

Полагаю, вам нужна связь ManyToOne: один заказ может иметь несколько расходов?

Для этого вы можете удалить свойство затрат из модели заказа. И вам нужно изменить свойство order_id модели ProjectExpense следующим образом (как уже прокомментировал @Lambo):

order = models.ForeignKey(Order, on_delete=models.CASCADE)

Когда вы запрашиваете модель заказа, соответствующие расходы будут включены, если вы попросите их и и наоборот.

Объекты создаются в бэкэнде следующим образом:

Новый заказ:

# input contains the data received from frontend
Order.objects.create(user_id=input.user_id,
                     client_name=input.client_name,
                     event_name=input.event_name,
                     contact=input.contact,
                     event_date=input.event_date)

Новый Расход:

# input contains expense details received from frontend
ProjectExpense.objects.create(user_id=input.user_id,
                              order_id=input.order_id,
                              exp=input.exp,
                              exp_desc=input.exp_desc,
                              amount=input.amount)

Это важно, чтобы вы написали order_id=, хотя свойство в самой модели называется order.

1 голос
/ 14 апреля 2020

Спасибо всем за предоставленные мне ответы! Я смотрю на функцию GenericForeignKey. Этот учебник помог мне понять его.

Работа с расходами, связанными с соответствующим заказом, очень похожа на комментарии и публикации, как в блогах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...