从一个模型到另一个模型的多对多查询和模板渲染
ManytoMany query and template rendering from one model to another
我是 Django 的新手。我有两个不同的问题。
我无法在我的一个模型和另一个模型之间进行查询 (ManyToMany)。我可以用 shell 做到这一点,但我无法在模板中处理它。
我无法将一个模型的默认值分配给另一个模型的字段。
第一个问题;
我想做的是显示多个选项的值。为此,我可以在 shell:
中进行类似的查询
room[0].room_type_id.all()
但我无法在模板中执行此操作。另一方面,当我想用显示器显示它时,它 returns 是空的。我想在这里做什么;返回每个房间的房间类型,或访问 RoomType class 的 room_cost 并将其显示在模板中,对每个房间类型重复。
{% for room in rooms %}
<h3 class="card-title pricing-card-title"> {{room.room_type_id_display}} </h3>
{% endfor %}
我的第二个问题是;
将来自不同模型 属性 的值设置为其他模型字段中的默认值。即默认将Booking模型total_price的返回值赋值给Payment模型的price字段
如果有人能提供有关该主题的文档或资源,我将不胜感激。
class RoomType(models.Model):
ROOM_CHOICES = (
('1', 'O),
('2','T'),
('3', 'Th'),
('4','F'),
('5','Fi')
)
room_type = models.CharField(max_length=50,choices=ROOM_CHOICES)
room_type_des = models.TextField(blank=True,null=True)
room_cost = models.IntegerField()
def __str__(self):
return str(self.room_type)
class Room(models.Model):
room_number = models.IntegerField()
room_des = models.TextField(blank=True,null=True)
room_availabe = models.BooleanField(default=True)
room_type_id = models.ManyToManyField(RoomType)
def __str__(self):
return str(self.room_number)
class Booking(models.Model):
room_number_id = models.ForeignKey(Room,on_delete=models.DO_NOTHING)
customer_id = models.ManyToManyField(Customer)
check_in = models.DateTimeField(auto_now_add=True)
check_out = models.DateTimeField(auto_now_add=False,auto_now=False,auto_created=False, null=True)
status = models.BooleanField(default=False)
@property
def calculate_day(self):
day = self.check_out - self.check_in
return str(day.days)
@property
def total_price(self):
day = self.check_out - self.check_in
price = self.room_number_id.room_type_id.room_cost
return price*day.days
class Payment(models.Model):
booking_id = models.ForeignKey(Booking,on_delete=models.DO_NOTHING)
ACCEPT_CHOICES = (
('N','N'),
('K','K'),
)
payment_type = models.CharField(max_length=1,choices=ACCEPT_CHOICES)
price = models.IntegerField()
payment_detail = models.TextField()
这里有一个小修改:不要使用“_id
”,因为它不是id
,它是外国模型的真实实例。
然后,使用“related_name
”,并思考“如果我从对面开始,我应该使用什么名字?” (它总是复数)。
对于您的 (2),您不能为“in-between table”设置默认值:ManyToMany 字段创建“join”table 以加入另外两个 table秒。您只能为 OneToOne 和 ForeignKey 字段设置默认值。
class RoomType(models.Model):
ROOM_CHOICES = (
('1', 'O),
('2','T'),
('3', 'Th'),
('4','F'),
('5','Fi')
)
room_type = models.CharField(max_length=50,choices=ROOM_CHOICES)
room_type_des = models.TextField(blank=True,null=True)
room_cost = models.IntegerField()
def __str__(self):
return str(self.room_type)
class Room(models.Model):
room_number = models.IntegerField()
room_des = models.TextField(blank=True,null=True)
room_availabe = models.BooleanField(default=True)
room_type = models.ManyToManyField(RoomType, related_name="rooms")
def __str__(self):
return str(self.room_number)
class Booking(models.Model):
room = models.ForeignKey(Room, related_name="bookings", on_delete=models.DO_NOTHING)
customer = models.ManyToManyField(Customer, related_name="bookings")
check_in = models.DateTimeField(auto_now_add=True)
check_out = models.DateTimeField(auto_now_add=False,auto_now=False,auto_created=False, null=True)
status = models.BooleanField(default=False)
@property
def calculate_day(self):
day = self.check_out - self.check_in
return str(day.days)
@property
def total_price(self):
day = self.check_out - self.check_in
price = self.room_number.room_type.room_cost
return price * day.days
class Payment(models.Model):
booking = models.ForeignKey(Booking, related_name="payments", on_delete=models.DO_NOTHING)
ACCEPT_CHOICES = (
('N','N'),
('K','K'),
)
payment_type = models.CharField(max_length=1,choices=ACCEPT_CHOICES)
price = models.IntegerField()
payment_detail = models.TextField()
如果您想要所有房型,它是:
RoomType.objects.all()
如果您想将所有类型“发送”到模板,请像这样使用 get_context_data
:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["room_types"] = RoomType.objects.all()
return context
并在您的模板中:
{% for room_type in room_types %}
{{ room_type }}
{% endfor %}
对于你的模板(以及我上面的模型代码),你可以这样做:
{% for room in rooms %}
<h3 class="card-title pricing-card-title"> {{ room.room_type }} </h3>
{% endfor %}
如果你想在一个表格中显示所有选项,这是另一个主题,太长了,无法在这里简单回答,阅读 the official documentation here。
我是 Django 的新手。我有两个不同的问题。
我无法在我的一个模型和另一个模型之间进行查询 (ManyToMany)。我可以用 shell 做到这一点,但我无法在模板中处理它。
我无法将一个模型的默认值分配给另一个模型的字段。
第一个问题;
我想做的是显示多个选项的值。为此,我可以在 shell:
中进行类似的查询room[0].room_type_id.all()
但我无法在模板中执行此操作。另一方面,当我想用显示器显示它时,它 returns 是空的。我想在这里做什么;返回每个房间的房间类型,或访问 RoomType class 的 room_cost 并将其显示在模板中,对每个房间类型重复。
{% for room in rooms %}
<h3 class="card-title pricing-card-title"> {{room.room_type_id_display}} </h3>
{% endfor %}
我的第二个问题是;
将来自不同模型 属性 的值设置为其他模型字段中的默认值。即默认将Booking模型total_price的返回值赋值给Payment模型的price字段
如果有人能提供有关该主题的文档或资源,我将不胜感激。
class RoomType(models.Model):
ROOM_CHOICES = (
('1', 'O),
('2','T'),
('3', 'Th'),
('4','F'),
('5','Fi')
)
room_type = models.CharField(max_length=50,choices=ROOM_CHOICES)
room_type_des = models.TextField(blank=True,null=True)
room_cost = models.IntegerField()
def __str__(self):
return str(self.room_type)
class Room(models.Model):
room_number = models.IntegerField()
room_des = models.TextField(blank=True,null=True)
room_availabe = models.BooleanField(default=True)
room_type_id = models.ManyToManyField(RoomType)
def __str__(self):
return str(self.room_number)
class Booking(models.Model):
room_number_id = models.ForeignKey(Room,on_delete=models.DO_NOTHING)
customer_id = models.ManyToManyField(Customer)
check_in = models.DateTimeField(auto_now_add=True)
check_out = models.DateTimeField(auto_now_add=False,auto_now=False,auto_created=False, null=True)
status = models.BooleanField(default=False)
@property
def calculate_day(self):
day = self.check_out - self.check_in
return str(day.days)
@property
def total_price(self):
day = self.check_out - self.check_in
price = self.room_number_id.room_type_id.room_cost
return price*day.days
class Payment(models.Model):
booking_id = models.ForeignKey(Booking,on_delete=models.DO_NOTHING)
ACCEPT_CHOICES = (
('N','N'),
('K','K'),
)
payment_type = models.CharField(max_length=1,choices=ACCEPT_CHOICES)
price = models.IntegerField()
payment_detail = models.TextField()
这里有一个小修改:不要使用“_id
”,因为它不是id
,它是外国模型的真实实例。
然后,使用“related_name
”,并思考“如果我从对面开始,我应该使用什么名字?” (它总是复数)。
对于您的 (2),您不能为“in-between table”设置默认值:ManyToMany 字段创建“join”table 以加入另外两个 table秒。您只能为 OneToOne 和 ForeignKey 字段设置默认值。
class RoomType(models.Model):
ROOM_CHOICES = (
('1', 'O),
('2','T'),
('3', 'Th'),
('4','F'),
('5','Fi')
)
room_type = models.CharField(max_length=50,choices=ROOM_CHOICES)
room_type_des = models.TextField(blank=True,null=True)
room_cost = models.IntegerField()
def __str__(self):
return str(self.room_type)
class Room(models.Model):
room_number = models.IntegerField()
room_des = models.TextField(blank=True,null=True)
room_availabe = models.BooleanField(default=True)
room_type = models.ManyToManyField(RoomType, related_name="rooms")
def __str__(self):
return str(self.room_number)
class Booking(models.Model):
room = models.ForeignKey(Room, related_name="bookings", on_delete=models.DO_NOTHING)
customer = models.ManyToManyField(Customer, related_name="bookings")
check_in = models.DateTimeField(auto_now_add=True)
check_out = models.DateTimeField(auto_now_add=False,auto_now=False,auto_created=False, null=True)
status = models.BooleanField(default=False)
@property
def calculate_day(self):
day = self.check_out - self.check_in
return str(day.days)
@property
def total_price(self):
day = self.check_out - self.check_in
price = self.room_number.room_type.room_cost
return price * day.days
class Payment(models.Model):
booking = models.ForeignKey(Booking, related_name="payments", on_delete=models.DO_NOTHING)
ACCEPT_CHOICES = (
('N','N'),
('K','K'),
)
payment_type = models.CharField(max_length=1,choices=ACCEPT_CHOICES)
price = models.IntegerField()
payment_detail = models.TextField()
如果您想要所有房型,它是:
RoomType.objects.all()
如果您想将所有类型“发送”到模板,请像这样使用 get_context_data
:
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["room_types"] = RoomType.objects.all()
return context
并在您的模板中:
{% for room_type in room_types %}
{{ room_type }}
{% endfor %}
对于你的模板(以及我上面的模型代码),你可以这样做:
{% for room in rooms %}
<h3 class="card-title pricing-card-title"> {{ room.room_type }} </h3>
{% endfor %}
如果你想在一个表格中显示所有选项,这是另一个主题,太长了,无法在这里简单回答,阅读 the official documentation here。