我正在做一个个人项目来管理餐厅。
我的两个模型都遇到问题,这些模型是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/