Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django中两个模型之间的关系_Python_Django - Fatal编程技术网

Python Django中两个模型之间的关系

Python Django中两个模型之间的关系,python,django,Python,Django,我有两种型号-订单和费用。费用是与特定订单相对应的积垢清单。我如何在这两个模型之间建立这样的关系 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) eve

我有两种型号-订单和费用。费用是与特定订单相对应的积垢清单。我如何在这两个模型之间建立这样的关系

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

我尝试用当前订单分配字段订单ID。但是我如何才能通过当前订单。

我猜您需要一个多人关系:一个订单可以有多个费用

为此,您可以从订单模型中删除expenses属性。 您需要修改ProjectExpense模型的order_id属性,如下所示(正如@Lambo已经注释的):

当您查询订单模型时,如果您要求相关费用,则相关费用将包括在内,反之亦然

对象在后端中的创建方式如下所示:

新秩序:

# 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\u id=
非常重要,尽管模型中的属性本身被称为
order

谢谢大家为我提供答案!我正在查看的功能是GenericForeignKey。教程帮助我理解了它


与各自订单相关的费用处理方式与博客中的评论和帖子类似。

您尝试过吗?order\u id=models.ForeignKey(order,on\u delete=models.CASCADE)。添加费用时,您需要更新订单中的费用字段谢谢您的评论!是的,但它会给出一个顺序列表,最终用户必须明确提到顺序。我只想动态添加。你想如何动态链接它?您需要从列表中选择订单,很抱歉,我没有提供必要的详细信息。这次我会澄清,订单列表包含所有订单。如果我点击一个特定的订单,它将被重定向到一个页面,其中包含有关该特定订单的完整详细信息。在该页面中,我有一个按钮来添加该特定订单的费用。当我单击添加费用时,这些费用列表必须分别添加到该特定订单中。谢谢您的回答!我相信这会有帮助的。但我猜,多通关系给出了一个订单ID列表。用户每次添加费用时都必须选择一项。每当我打开订单详细信息并添加费用时,我添加的所有费用都必须与特定订单相对应。@akajash我不确定我是否了解您的预期行为。是否要向单个订单添加新费用,以便此费用仅属于一个特定订单?为此,您需要向后端提供费用详细信息和订单id。只要只有一个id被传输到后端,用户如何选择订单并不重要。我猜这将是另一个问题,因为我们对你的前端一无所知。我不确定。很抱歉我没有提供必要的细节。这次我会澄清的,订单列表包含所有订单。如果我点击一个特定的订单,它将被重定向到一个页面,其中包含有关该特定订单的完整详细信息。在该页面中,我有一个按钮来添加该特定订单的费用。当我单击“添加费用”时,这些费用列表必须分别添加到该特定订单。然后我猜您知道该订单的id,因为您在该特定订单的页面上。此id需要传输到后端,新费用将链接到订单。完全正确!但是我不知道如何自动传递当前订单ID,而不必显式地键入订单ID。但是我有一个想法,订单ID包含在页面的URL中,我可以通过它获取它吗?URL:localhost:8000/order/22/details/
# 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)