我正在做一个个人项目来管理餐厅。
我的两个模型都遇到问题,这些模型是DiningRoom和Table。

DiningRoom代表餐厅可能拥有的任何区域(例如,我们可以在建筑物的露台上拥有一个内部区域,而另一个区域可以具有该区域)。
在每个DiningRoom中,我们都可以设置表格的布局。

因此,我发现映射这种更面向对象的方法是通过多对一关系(ForeignKey)。由于一个DiningRoom可以有多个表,而一个Table只能位于一个DiningRoom中。对?

所以我的模型是:

class DiningRoom(models.Model):
    account = models.ForeignKey(Account, on_delete=models.CASCADE, null=False)
    name = models.CharField(max_length=50, null=False, blank=False)
    rows = models.IntegerField(max=15, null=False)
    cols = models.IntegerField(max=15, null=False)  # rows and columns are for the room's grid layout.


class Table(models.Model):
    row = models.IntegerField(max=15, null=False)  # The row in the room's grid where the table is at.
    col = models.IntegerField(max=15, null=False)  # the column in the room's grid where the table is at.
    dining_room = models.ForeignKey(DiningRoom, on_delete=models.CASCADE, null=False)  # Here is the problem.


问题是,当我在视图中查询帐户的DiningRooms时,我还需要获取与queryset结果中每个DiningRoom相关的表。

def dining_rooms(request):
    try:
        account = Account.objects.get(id=request.session['account_id'])
    except Account.DoesNotExists:
        return response(request, "error.html", {'error': 'Account.DoesNotExists'})

    dining_rooms = DiningRoom.objects.filter(account=account)


但是我也需要在Dining_rooms中列出结果表!

我发现了两种可能的解决方案,但对我来说似乎都不对。一种是建立多对多关系,并验证任何表仅在视图中位于一个DiningRoom中。第二个更糟糕的情况是,对于在查询集中获得的每个DiningRoom,仅一次提取表(但假设有5个或6个不同区域的餐厅(DiningRooms),则每次需要将数据库提取6次)。

反之亦然,并且无法获取所有的Tables和与select_related的DiningRooms是不可能的,因为可能有一个不带Tables的DiningRoom(在这种情况下,我们将缺少DiningRooms)。

最好的方法是什么?谢谢!

最佳答案

您可以向后使用related_name或关系,一种可接受的解决方案是在DiningRoom模型中创建一个名为associated_tables()的方法,然后使用related_name(在此情况下,模型名为set_set)返回。它是小写子模型的名称,后跟_set

class DiningRoom(models.Model):
    #your fields

    def associated_tables(self):
        return self.table_set.all()


此外,此视频教程可以使您度过美好的一天,并为您提供有关反向关系的更好的主意:
https://youtu.be/7tAZdYRA8Sw

关于python - Django模型针对此反向ForeignKey的最佳解决方案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59605249/

10-09 21:47