Python 如何在Django模型中定义关系?
我正在写一个Django应用程序,用户可以在其中创建一个关于可用房间的帖子,并附上描述和图片 我很难弄清楚如何定义模型中的关系。我认为用户类和地主类之间的关系将是多对一的关系。 我的问题是,我如何定义用户、房东和其他类别(如rentalProperty、contract和media)之间的关系 谢谢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
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
...