gpt4 book ai didi

python - Django模型针对这种反向ForeignKey的最佳解决方案

转载 作者:行者123 更新时间:2023-12-01 06:37:28 24 4
gpt4 key购买 nike

我正在制定一个管理餐馆的个人项目。我的两个模型面临问题,这些模型是 DiningRoom 和 Table。

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

因此,我发现更面向对象的映射方式是通过多对一关系(ForeignKey)。由于一间 DiningRoom 可以有很多张 table ,而一张 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.

问题是,当我在 View 中查询帐户的 DiningRoom 时,我还需要获取与查询集结果中每个 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 中的结果表!

我找到了两种可能的解决方案,但对我来说似乎没有一个是“正确的”。一种是建立多对多关系并验证任何表仅位于 View 中的一个 DiningRoom 中。第二个也是更糟糕的一个可能是为查询集中获得的每个 DiningRoom 获取一次表(但想象一家餐厅有 5 或 6 个不同的区域(DiningRooms),每次都需要获取数据库六次)。

反之亦然,获取所有表格和 select_相关的 DiningRoom 是不可能的,因为可能有一个 DiningRoom 中没有表格(在这种情况下,我们将缺少 DiningRoom)。

处理这个问题的最佳方法是什么?谢谢!

最佳答案

您可以向后使用 related_name 或关系,可接受的解决方案是在 DiningRoom 模型中创建一个名为 Associated_tables() 的方法,并使用 related_name(modelname_set,在本例中为 table_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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com