【发布时间】:2021-09-09 18:54:50
【问题描述】:
我对 django 有点陌生,我正在尝试构建一个 airbnb 克隆以更好地理解 django。当我尝试启动服务器时,我不断收到错误消息。我对如何解决错误感到困惑。它可以追溯到我的虚拟环境文件,但我从未将任何代码直接写入其中。我发现如果我删除我的 admin.py 文件和我的 models.py 文件的内容,它会消除错误,并且我的服务器会启动。我认为这表明错误可能来自这些文件之一。 这是错误代码:
Exception in thread django-main-thread:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py", line 954, in _bootstrap_inner
self.run()
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/threading.py", line 892, in run
self._target(*self._args, **self._kwargs)
File "/Users/AUTH_SYSTEM/backend/venv/lib/python3.9/site-packages/django/utils/autoreload.py", line 64, in wrapper
fn(*args, **kwargs)
File "/Users/AUTH_SYSTEM/backend/venv/lib/python3.9/site-packages/django/core/management/commands/runserver.py", line 118, in inner_run
self.check(display_num_errors=True)
File "/Users/AUTH_SYSTEM/backend/venv/lib/python3.9/site-packages/django/core/management/base.py", line 419, in check
all_issues = checks.run_checks(
File "/Users/AUTH_SYSTEM/backend/venv/lib/python3.9/site-packages/django/core/checks/registry.py", line 76, in run_checks
new_errors = check(app_configs=app_configs, databases=databases)
File "/Users/AUTH_SYSTEM/backend/venv/lib/python3.9/site-packages/django/contrib/admin/checks.py", line 54, in check_admin_app
errors.extend(site.check(app_configs))
File "/Users/AUTH_SYSTEM/backend/venv/lib/python3.9/site-packages/django/contrib/admin/sites.py", line 92, in check
errors.extend(modeladmin.check())
File "/Users/AUTH_SYSTEM/backend/venv/lib/python3.9/site-packages/django/contrib/admin/options.py", line 122, in check
return self.checks_class().check(self, **kwargs)
File "/Users/AUTH_SYSTEM/backend/venv/lib/python3.9/site-packages/django/contrib/admin/checks.py", line 648, in check
*self._check_list_filter(admin_obj),
File "/Users/AUTH_SYSTEM/backend/venv/lib/python3.9/site-packages/django/contrib/admin/checks.py", line 804, in _check_list_filter
return list(chain.from_iterable(
File "/Users/AUTH_SYSTEM/backend/venv/lib/python3.9/site-packages/django/contrib/admin/checks.py", line 805, in <genexpr>
self._check_list_filter_item(obj, item, "list_filter[%d]" % index)
File "/Users/AUTH_SYSTEM/backend/venv/lib/python3.9/site-packages/django/contrib/admin/checks.py", line 848, in _check_list_filter_item
get_fields_from_path(obj.model, field)
File "/Users/AUTH_SYSTEM/backend/venv/lib/python3.9/site-packages/django/contrib/admin/utils.py", line 487, in get_fields_from_path
parent = get_model_from_relation(fields[-1])
File "/Users/AUTH_SYSTEM/backend/venv/lib/python3.9/site-packages/django/contrib/admin/utils.py", line 438, in get_model_from_relation
return field.get_path_info()[-1].to_opts.model
File "/Users/AUTH_SYSTEM/backend/venv/lib/python3.9/site-packages/django/db/models/fields/related.py", line 712, in get_path_info
opts = self.remote_field.model._meta
AttributeError: 'str' object has no attribute '_meta'
这是我的related.py 文件中突出显示的行:
opts = self.remote_field.model._meta
这是整个函数:
def get_path_info(self, filtered_relation=None):
"""Get path from this field to the related model."""
opts = self.remote_field.model._meta
from_opts = self.model._meta
return [PathInfo(
from_opts=from_opts,
to_opts=opts,
target_fields=self.foreign_related_fields,
join_field=self,
m2m=False,
direct=True,
filtered_relation=filtered_relation,
)]
这是我的 admin.py 文件:
from django.contrib import admin
# Register your models here.
#New
from django.contrib import admin
from django.utils.html import mark_safe
from .models import Room, RoomType, Amenity, Facility, HouseRule, Photo
@admin.register(RoomType, Amenity, Facility, HouseRule)
class ItemAdmin(admin.ModelAdmin):
"""Register model classes inherited from the AbstractItem model"""
list_display = ("name", "used_by")
def used_by(self, obj):
return obj.rooms.count()
@admin.register(Photo)
class PhotoAdmin(admin.ModelAdmin):
"""Register Photo model at admin panel"""
list_display = ("__str__", "get_thumbnail")
def get_thumbnail(self, obj):
return mark_safe(f'<img width="50px" src="{obj.file.url}" />')
get_thumbnail.short_description = "Thumbnail"
class PhotoInlineAdmin(admin.TabularInline):
"""Photo model's inline admin"""
model = Photo
@admin.register(Room)
class RoomAdmin(admin.ModelAdmin):
"""Register Room model at admin panel
Filter by:
instant_book : BooleanField
host.is_superhost : BooleanField
city : CharField
room_type : RoomType Model
amenities : Amenity Model
facilities : Facility Model
house_rules : HouseRule Model
country : CharField
Search by:
city : exact
host.username : startwith
Admin function :
count_amenities : return amenities count
count_facilities : return facilities count
count_house_rules : return house_rules count
"""
inlines = (PhotoInlineAdmin,)
fieldsets = (
(
"Basic Info",
{"fields": ("name", "description", "country", "address", "price")},
),
("Times", {"fields": ("check_in", "check_out", "instant_book")}),
("Spaces", {"fields": ("guests", "beds", "bedrooms", "baths")}),
(
"More About the Space",
{
"classes": ("collapse",),
"fields": ("amenities", "facilities", "house_rules"),
},
),
("Last Details", {"fields": ("host",)}),
)
raw_id_fields = ("host",)
list_display = (
"name",
"country",
"city",
"price",
"address",
"guests",
"beds",
"bedrooms",
"baths",
"check_in",
"check_out",
"instant_book",
"count_amenities",
"count_photos",
"total_rating",
)
list_filter = (
"instant_book",
"host__is_superhost",
"city",
"room_type",
"amenities",
"facilities",
"house_rules",
"country",
)
filter_horizontal = ("amenities", "facilities", "house_rules")
search_fields = ("=city", "^host__username")
def count_amenities(self, obj):
return obj.amenities.count()
def count_photos(self, obj):
return obj.photos.count()
count_photos.short_description = "Photo Count"
这是我的 models.py 文件:
from django.db import models
# Create your models here.
#New
from django.urls import reverse
from django_countries.fields import CountryField
from core.models import AbstractTimeStamp
class AbstractItem(AbstractTimeStamp):
"""Abstract Item Model
Inherit:
AbstractTimeStamp
Fields:
name : CharField
created_at : DateTimeField
updated_at : DateTimeField
Method:
__str__ : return name
"""
name = models.CharField(max_length=80, unique=True)
class Meta:
abstract = True
def __str__(self):
return self.name
class RoomType(AbstractItem):
"""RoomType Model
Inherit:
AbstractItem
"""
class Meta:
verbose_name = "Room Type"
class Amenity(AbstractItem):
"""Amenity Model
Inherit:
AbstractItem
"""
class Meta:
verbose_name_plural = "Amenities"
class Facility(AbstractItem):
"""Facility Model
Inherit:
AbstractItem
"""
class Meta:
verbose_name_plural = "Facilities"
class HouseRule(AbstractItem):
"""HouseRule Model
Inherit:
AbstractItem
"""
class Meta:
verbose_name = "House Rule"
class Photo(AbstractTimeStamp):
"""Photo Model
Inherit:
AbstractTimeStamp
Fields:
caption : CharField
file : ImageField
room : Room Model (1:N)
created_at : DateTimeField
updated_at : DateTimeField
Method:
__str__ : return caption
"""
caption = models.CharField(max_length=80)
file = models.ImageField(upload_to="room_photos")
room = models.ForeignKey("Room", related_name="photos", on_delete=models.CASCADE)
def __str__(self):
return self.caption
class Room(AbstractTimeStamp):
"""Room Model
Inherit:
AbstractTimeStamp
Fields:
name : CharField
description : TextField
country : CountryField
city : CharField
price : IntegerField
address : CharField
guests : IntegerField
beds : IntegerField
bedrooms : IntegerField
baths : IntegerField
check_in : TimeField
check_out : TimeField
instant_book : BooleanField
host : users app User model (1:N)
room_type : RoomType model (1:N)
amenities : Amenity model (N:N)
facilities : Facility model (N:N)
house_rules : HouseRule model(N:N)
created_at : DateTimeField
updated_at : DateTimeField
Method:
__str__ : return name
save : change capitalized city name and save
total_rating : return all reviews rating avg
first_photo : return room's first photo file url
"""
name = models.CharField(max_length=140)
description = models.TextField()
country = CountryField()
city = models.CharField(max_length=80)
price = models.IntegerField()
address = models.CharField(max_length=140)
guests = models.IntegerField()
beds = models.IntegerField()
bedrooms = models.IntegerField()
baths = models.IntegerField()
check_in = models.TimeField()
check_out = models.TimeField()
instant_book = models.BooleanField(default=False)
host = models.ForeignKey(
"users.User", related_name="rooms", on_delete=models.CASCADE
)
room_type = models.ForeignKey(
"RoomType", related_name="rooms", on_delete=models.SET_NULL, null=True
)
amenities = models.ManyToManyField("Amenity", related_name="rooms", blank=True)
facilities = models.ManyToManyField("Facility", related_name="rooms", blank=True)
house_rules = models.ManyToManyField("HouseRule", related_name="rooms", blank=True)
def __str__(self):
return self.name
def save(self, *args, **kwargs):
self.city = str.capitalize(self.city)
super().save(*args, **kwargs)
def get_absolute_url(self):
return reverse("rooms:detail", kwargs={"pk": self.pk})
def total_rating(self):
all_reviews = self.reviews.all()
if len(all_reviews) == 0:
return 0
all_ratings = 0
for review in all_reviews:
all_ratings += review.rating_average()
return round(all_ratings / len(all_reviews), 2)
def first_photo(self):
try:
(photo,) = self.photos.all()[:1]
return photo.file.url
except Exception:
return None
def get_next_four_photos(self):
photos = self.photos.all()[1:5]
return photos
我不确定从哪里开始,而且我太害怕直接将任何内容写入虚拟环境。有没有人知道从哪里开始寻找,或者问题可能是什么?
【问题讨论】:
标签: python-3.x django django-models django-rest-framework virtualenv