Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django模型中定义关系?_Python_Django_Django Models - Fatal编程技术网

Python 如何在Django模型中定义关系?

Python 如何在Django模型中定义关系?,python,django,django-models,Python,Django,Django Models,我正在写一个Django应用程序,用户可以在其中创建一个关于可用房间的帖子,并附上描述和图片 我很难弄清楚如何定义模型中的关系。我认为用户类和地主类之间的关系将是多对一的关系。 我的问题是,我如何定义用户、房东和其他类别(如rentalProperty、contract和media)之间的关系 谢谢 from django.db import models from django.contrib.auth.models import User # Create your models here

我正在写一个Django应用程序,用户可以在其中创建一个关于可用房间的帖子,并附上描述和图片

我很难弄清楚如何定义模型中的关系。我认为用户类和地主类之间的关系将是多对一的关系。 我的问题是,我如何定义用户、房东和其他类别(如rentalProperty、contract和media)之间的关系

谢谢

from django.db import models
from django.contrib.auth.models import User

# Create your models here.


class Landlord(models.Model):
    user = models.ForeignKey("User", on_delete=models.PROTECT)
    address = models.CharField(max_length=255)
    social_security_number = models.CharField(max_length=255)
    email_address = models.CharField(max_length=255)


class rentalProperty(models.Model):
    landlord = models.ForeignKey("Landlord", on_delete=models.PROTECT)
    PROPERTY_LISTING_CHOICES = [
        (APARTMENT, 'Apartment'),
        (HOLIDAY_HOME, 'Holiday home'),
        (SINGLE_FAMILY_HOME, 'Single family home'),
        (COMMERCIAL, 'Commercial'),
    ]
    type_of_property_listing = models.CharField(
        max_length = 50,
        choices = PROPERTY_LISTING_CHOICES,
        default = APARTMENT
    )
    BUILDING_LISTING_CHOICES = [
        (CONDOMINIUM, 'Condominium'),
        (ROW_HOUSE, 'Row house'),
        (SINGLE_FAMILY_HOUSE, 'Single family house'),
        (HOLIDAY_HOME, 'Holiday_home'),
        (DUPLEX, 'Duplex'),
        (SINGLE_FAMILY_HOME_COOP, 'Single family home(CO-OP)'),
        (CONDOMINIUM_EXTERNAL_ENTRANCE, 'Condominium external entrance'),
        (WOODEN_COMDOMINIUM_HOUSE, 'Wooden condominium house')
    ]
    type_of_building_choices = models.CharField(
        max_length = 50,
        choices = BUILDING_LISTING_CHOICES,
        default = CONDOMINIUM
    )
    created_by = models.ForeignKey(User, related_name='rentalProperties')

class Location(models.Model):
    rental_property = models.ForeignKey("rentalProperty", on_delete=models.PROTECT)
    street = models.CharField(max_length=255)
    borough = models.CharField(max_length=255)
    postal_code = models.CharField(max_length=20)
    city = models.CharField(max_length=50)
    province = models.CharField(max_length=50)
    country = models.CharField(max_length=50)

class ApartmentBasicInfo(models.Model):
    location = models.ForeignKey("Location", on_delete=models.PROTECT)
    title = models.TextField()
    living_area = models.IntegerField()
    number_of_rooms = models.IntegerField()
    floors = models.IntegerField()
    furnished = models.BooleanField(initial=True)
    KITCHEN_TYPE_CHOICES = [
        (UNKNOWN, 'Unknown'),
        (NO_KITCHEN, 'No kitchen'),
        (KITCHEN, 'Kitchen'),
        (MINI_KITCHEN, 'Mini kitchen'),
        (OPEN_KITCHEN, 'Open kitchen')
    ]
    type_of_kitchen_choices = models.CharField(
        max_length = 50,
        choices = KITCHEN_TYPE_CHOICES,
        default = UNKNOWN
    ) 
    sauna = models.BooleanField(initial=True)
    balcony = models.BooleanField(initial=True)
    apartment_layout_type = models.IntegerField()
    APARTMENT_CONDITIONS_CHOICES = [
        (EXCELLENT, 'excellent'),
        (GOOD, 'good'),
        (FAIR, 'fair'),
        (POOR, 'poor'),
        (VERY_BAD, 'very bad')
    ]
    apartment_condition = models.CharField(
        max_length = 50,
        choices = APARTMENT_CONDITIONS_CHOICES,
        default = EXCELLENT
    )
    apartment_conditions_freetext = models.TextField()




class Contract(models.Model):
    rentalproperty = models.ForeignKey("rentalProperty", on_delete=models.PROTECT)
    RENTAL_TERMS_CHOICES = [
        (PERMANENT, 'permanent'),
        (FiXED, 'fixed'),
    ]
    type_of_rental_terms = models.CharField(
        max_length = 20,
        choices = RENTAL_TERMS_CHOICES,
        default = PERMANENT
    ) 
    rent_availability = models.DateField()
    rent_availability_info = models.TextField()
    rent_per_month = models.IntegerField()
    deposit_for_rent = models.IntegerField()
    deposit_for_rent_info = models.TextField()
    rental_increment = models.IntegerField()
    index_value = models.IntegerField()
    index_date = models.DateField()
    RENT_ELECTRICITY_CHOICES = [
        (UNDEFINED, 'undefined'),
        (INCLUDED_IN_THE_RENT, 'included in the rent'),
        (RESPONSIBILITY_OF_TENANT, 'responsibility of tenant'),
        (FIXED_FEE, 'fixed fee'),
        (OTHER, 'other')
    ]
    rent_electricity = models.CharField(
        max_length = 50,
        choices = RENTAL_TERMS_CHOICES,
        default = UNDEFINED
    )
    electricity_fixed_fee = models.IntegerField()
    WATER_FEE_CHOICES = [
        (UNDEFINED, 'undefined'),
        (INCLUDED_IN_THE_RENT, 'included in the rent'),
        (RESPONSIBILITY_OF_TENANT, 'responsibility of tenant'),
        (FIXED_FEE_PER_PERSON, 'fixed fee per person'),
        (OTHER, 'other')
    ]
    water_fee = models.CharField(
        max_length = 50,
        choices = WATER_FEE_CHOICES,
        default = UNDEFINED
    )
    water_fee_per_person = models.IntegerField()
    HEATING_FEE_CHOICES = [
         (UNDEFINED, 'undefined'),
        (INCLUDED_IN_THE_RENT, 'included in the rent'),
        (RESPONSIBILITY_OF_TENANT, 'responsibility of tenant'),
        (FIXED_FEE, 'fixed fee'),
        (OTHER, 'other')
    ]
    heating_fee = models.CharField(
        max_length = 50,
        choices = HEATING_FEE_CHOICES,
        default = UNDEFINED
    )
    heating_fixed_fee = models.IntegerField()
    Other_cost = models.TextField()
    pets_allowed = models.BooleanField(initial=True)
    smoking_allowed = models.BooleanField(initial=True)
    insurance_required = models.BooleanField(initial=True)
    other_terms = models.TextField()

class Media(models.Nodel):
    apartment_pictures = models.ImageField()
    videos = models.CharField(max_length=512)
    virtual_tours = models.CharField(max_length=512)

有很多。。你的例子中有很多错误。我认为这只是一个草稿

我想展示一些修复和建议

  • 在模型中,您应该使用
    默认值
    而不是
    初始值
    -
    初始值
    表单中使用
  • 对于
    选项
    我想展示如何以更简单的方式解决
    选项
    ——只需使用
    枚举
  • 当使用
    OneToOne
    关系时,就像在我的示例
    Location
    中一样,
    RentalProperty.Location
    返回的对象是
    Location
    类的实例,而不是
    QuerySet
    ,在代码中更容易处理

  • 非常感谢您的澄清。我不熟悉Django和数据库,因此这个模型不太好。我会彻底检查并尝试实施它。@superv如果你有任何问题,请将它们发布在StackOverflow上-这里的社区将帮助你:)不要忘了对答案进行投票,当你有足够的分数时,接受它。我有权对答案进行投票。请您解释一下为什么位置模型与rentalProperty有一对一的关系,以及它如何将位置链接到创建发布的用户。我见过使用django cookiecutter在模型中创建选择的解决方案,它与使用您创建的枚举类有何不同?谢谢您的时间。@superv感谢您投票并接受答案。回答您的问题:1)位置是O2O关系,因为
    RentalProperty
    只能有一个位置:),将其放入单独的模型需要更多的研究,因为如果
    RentalProperty
    不需要每次都使用
    Location
    ,这将减少DB和Django之间传输的字段,但可能会增加需要数据的时间(因为Django将在
    内部联接中或在单独的查询中查询DB)。2) 用户如何与位置和发布相关联?3) 有什么例子吗?谢谢你花时间回复。在RentalProperty类中定义位置是更好的解决方案吗?我所说的第二个问题是,如果用户创建了一篇关于某个属性的帖子,O2O关系是否足以将用户链接到location类?
    
    from django.contrib.auth import get_user_model
    from django.db import models
    import enum
    
    
    UserModel = get_user_model()
    
    
    class ToChoicesEnum(enum.Enum):
        @classmethod
        def to_choices(cls):
            return tuple((tag.name, str(tag.value)) for tag in cls)
    
    
    class Landlord(models.Model):
        user = models.ForeignKey(UserModel, on_delete=models.PROTECT)
        address = models.CharField(max_length=255)
        social_security_number = models.CharField(max_length=255)
        email_address = models.EmailField()
    
    
    class RentalProperty(models.Model):
        landlord = models.ForeignKey("Landlord", on_delete=models.PROTECT)
        created_by = models.ForeignKey(UserModel, related_name='rentalProperties')
    
        class PropertyListingChoices(ToChoicesEnum):
            APARTMENT = 'Apartment'
            HOLIDAY_HOME = 'Holiday home'
            SINGLE_FAMILY_HOME = 'Single family home'
            COMMERCIAL = 'Commercial'
    
        type_of_property_listing = models.CharField(
            max_length=50,
            choices=PropertyListingChoices.to_choices(),
            default=PropertyListingChoices.APARTMENT
        )
        ...
    
    
    class Location(models.Model):
        rental_property = models.OneToOneField("RentalProperty", related='location', on_delete=models.PROTECT)
        ...
    
    
    class ApartmentBasicInfo(models.Model):
        rental_property = models.OneToOneField("RentalProperty", related='basic_info', on_delete=models.PROTECT)
        ...
    
    
    class RentalImages(models.Model):
        rental_property = models.ForeignKey("RentalProperty", related='images', on_delete=models.PROTECT)
        apartment_picture = models.ImageField()
    
    
    class RentalMedia(models.Model):
        class AssetTypeChoices(ToChoicesEnum):
            VIDEO = 'video'
            TOUR = 'tour'
        rental_property = models.ForeignKey("RentalProperty", related='rental_media', on_delete=models.PROTECT)
        asset_url = models.URLField()
        asset_type = models.CharField(max_length=10, choices=AssetTypeChoices.to_choices())
    
    
    class Contract(models.Model):
        rental_property = models.ForeignKey("RentalProperty", related='contracts', on_delete=models.PROTECT)
        user = models.ForeignKey(UserModel, related='contracts', on_delete=models.PROTECT)
        smoking_allowed = models.BooleanField(default=True)  # in models you should use default instead initial
        ...