DJango和Python

时间:2016-02-11 08:22:38

标签: python django python-2.7 django-models mysql-python

我是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')

3 个答案:

答案 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存在   不

您需要自己实施此检查。模型不了解数据的所有层次结构;或您的业务规则。

您需要检查:

  1. 属性存在
  2. 被引用的房间属于该属性。
  3. 图片的类型/尺寸正确;等
  4. 尝试这样的模式:

    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