我是DJango和Python的新手。现在我正在构建一个看起来像这样的模型:
属性 - >房间 - >图像。
现在我在房间模型中将属性ID设置为外键。
并且房间ID作为图像模型中的外键。
但是当我打电话给特定房间和特定房产插入新图像时。
即使属性id不存在,它也会创建一个图像对象。它只检查房间ID。
虽然看涨期权正在完美执行。
我想在插入新图片之前验证房间ID和属性ID。
代码:
class PropertyRoom(models.Model):
pass
class PropertyRoom(models.Model):
property = models.ForeignKey(Property,related_name='rooms')
class PropertyRoomImage(AbstractImage):
room = models.ForeignKey(PropertyRoom, related_name='images')
答案 0 :(得分:0)
虽然从理论上讲,您的数据库应确保您拥有正确的数据,但有时情况可能并非如此(IIRC外键可能不存在于具有混合表引擎的MySQL数据库中(InnoDB和MyISAM))< / p>
假设您使用表单,则可以在上传表单中添加form validation。
def clean(self):
cleaned_data = super(MyForm, self).clean()
image = cleaned_data['image']
property = cleaned_data['property']
if image.room.property != property:
raise ValidationError("room property and supplied property don't match")
return cleaned_data
您也可以为模型编写相同的逻辑,但要注意默认情况下它们不会被save
调用,因此您必须明确地创建它们。 Official model validations documentation
image = PropertyRoomImage()
image.room = ...
image.full_clean() # call it explicitly as save doesn't
image.save()
答案 1 :(得分:0)
localhost:8000 / api / properties / 221 / rooms / 1 / images我正在这个网址上进行帖子调用,例如。房间ID 1存在但属性ID 221不存在。
您根本不需要通过房间,或者如果您确实需要,那么您可以忽略它,您可以使用房间的ID创建图像,如果您需要房产,那么您可以通过room.property
答案 2 :(得分:0)
localhost:8000 / api / properties / 221 / rooms / 1 / images我正在发帖 以此网址为例。房间ID 1存在但属性id 221存在 不
您需要自己实施此检查。模型不了解数据的所有层次结构;或您的业务规则。
您需要检查:
尝试这样的模式:
from django.http import Http404
from django.shortcuts import get_object_or_404
def api(request, room=None, property=None):
property = get_object_or_404(Property, pk=property)
if not property.property_room_set.filter(pk=room).exists():
raise Http404
# other checks
# your normal logic