在MySQL中,我有3个表:Client、Room和ClientRoom,它指向前面的两个表。
-- -----------------------------------------------------
-- Table `client`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `client` (
`id` INT NOT NULL,
`name` VARCHAR(255) NULL,
PRIMARY KEY (`id`)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
-- -----------------------------------------------------
-- Table `room`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `room` (
`id` INT NOT NULL,
`price` DECIMAL(18,2) NOT NULL,
`apart_num` INT NOT NULL,
`free` BOOL default TRUE,
PRIMARY KEY (`id`)
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
-- -----------------------------------------------------
-- Table `client-room`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `client_room` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`client_id` INT NOT NULL,
`room_id` INT NOT NULL,
`date_in` DATETIME NOT NULL,
`date_out` DATETIME NOT NULL,
INDEX `fk_client_room_idx` (`client_id` ASC),
CONSTRAINT `fk_client_room_id`
FOREIGN KEY (`client_id`)
REFERENCES `client` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
INDEX `fk_room_idx` (`room_id` ASC),
CONSTRAINT `fk_room_id`
FOREIGN KEY (`room_id`)
REFERENCES `room` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
使用python manage.py inspectdb
class Client(models.Model):
id = models.IntegerField(primary_key=True)
name = models.CharField(max_length=255, blank=True, null=True)
class Meta:
managed = False
db_table = 'client'
class ClientRoom(models.Model):
client = models.ForeignKey(Client, models.DO_NOTHING)
room = models.ForeignKey('Room', models.DO_NOTHING)
date_in = models.DateTimeField()
date_out = models.DateTimeField()
class Meta:
managed = False
db_table = 'client_room'
class Room(models.Model):
id = models.IntegerField(primary_key=True)
price = models.DecimalField(max_digits=18, decimal_places=2)
apart_num = models.IntegerField()
free = models.IntegerField(blank=True, null=True)
class Meta:
managed = False
db_table = 'room'
问题是,要创建ClientRoom对象,我需要Client和Room对象的id,而不是两个对象:一个Client和一个Room。
def clientRoom(request):#This works
if request.method == "POST":
clientRoom = ClientRoom()
clientRoom.client_id = request.POST.get("client_id")
room=Room()
room.id = request.POST.get("room")
clientRoom.room = room
...
return render(request, "clientRoom.html", {"clientRoom": clientRoom})
def clientRoom(request):#This isn't working
if request.method == "POST":
clientRoom = ClientRoom()
client=Client()
client.id=request.POST.get("client_id")
clientRoom.client_id = client
room=Room()
room.id = request.POST.get("room")
clientRoom.room = room
...
return render(request, "clientRoom.html", {"clientRoom": clientRoom})
这对我来说是没有意义的,而且这也阻止了进一步的进展。我一直在做gui站点(在HTML上),它显示房间号,应该显示客户名,而不是ID,但是我不能得到客户名,因为ClientRoom不完全由客户对象组成,与Room相比。
<table><!-- Here I got only Client id, cannot access name by client_id.name,because client_id is just a number, while room is an object of Room, and i can access it's id -->
{% for record in clientsRooms %}
<tr>
<td>{{ record.client_id }}</td> <td>{{ record.room.id }}</td>
<td>{{ record.date_in }}</td> <td>{{ record.date_out }}</td>
</tr>
{% endfor %}
</table>
我应该更改什么使ClientRoom构造函数需要2个对象(客户端和房间,而不仅仅是房间对象和客户端id)?
将对象赋给外键字段时,不要将其赋给以_id
结尾的字段。这就是为什么你的一个例子不起作用的原因。您正在执行clientroom.client_id=client
,但client是client
对象,而不是ID。
以下所有赋值方法对您的模型都是有效的:
client_room = ClientRoom()
client_room.client_id = some_client_id
client_room.room_id = some_room_id
client_room = ClientRoom()
client_room.client = some_client_object
client_room.room = some_room_object
client_room = ClientRoom(client=some_client_object, room=some_room_object)
client_room = ClientRoom(client_id=some_client_id, room_id=some_room_id)
# And you can assign one by ID and the other by object, as you've already discovered.
我试图通过@datajpatest测试我的Spring存储库。我想通过电子邮件找到完全相同的用户,但我得到了另一个角色集。 首先,如果我开始我的项目,然后我设置测试用户和他的角色。 将保存用户的UserService中的一段代码。 在测试中比较对象是好主意,还是例如用户名/电子邮件就足够了?
我的业务规则是,如果第一个、最后一个和中间字段都相等,或者如果第一个和最后一个字段相等,并且其中一个(或两个)对象的中间字段为null,则两个Name对象被视为相等。 因此,在为我的Name类实现hash和equals方法时,我可以使用这样的用例:equals为两个对象返回true,但这两个对象的hash返回不同的值(因为一个对象的middle值为null值,而另一个对象的middle值为null
问题内容: 好吧,这是我的问题,我有3张桌子;地区,国家,州。国家可以在区域内部,州可以在区域内部。地区是食物链的顶端。 现在,我添加一个带有两列的Popular_areas表;region_id和Popular_place_id。是否可以将Popular_place_id用作国家 或 州的外键。我可能将不得不添加一个Popular_place_type列,以确定ID是否以任何一种方式描述一个国家
问题内容: 如果不是原始类型,返回类型的正确方法是什么?例如。我目前使用null如下。 问题答案: Void类是一个无法实例化的占位符类,用于保存对表示Java关键字void的Class对象的引用。 因此,以下任何条件就足够了: 参数化并返回或 参数化并返回 用您的一个参数化 你不能让这种方法,和其他任何回报 的东西 。由于忽略了某些内容,因此您可以返回任何内容。
如何使用hibernate注释实现下表? 当前代码为:(为简洁起见,已删除) 使用者 社交网络 SocialProfile公司 显然我的代码现在不能正常工作。有人能解释一下吗?
所以我有两个表,并且有一个预期的行增量,但是这个增量不会返回,除非我使用左外连接。有人能帮我理解为什么查询1适用于这个用例,而查询2不适用: