2016-08-13 2 views
1

このコード部分についてどう思いますか?それはどれくらい悪いですか?このようなコードを書くのは普通の習慣です。どのように私はこのコードを改善し、それをより短く、より読みやすく、そして改善したパフォーマンスにすることができますか?このdjangoのビューコードを改善するには?

私はこのコードはあまりよくないと思っています。特にそれを理解して維持してください。

def car_list(request): 

    if request.GET.get('city'): 
     city = request.GET.get('city').split(",")[0] 
    elif 'city' in request.COOKIES: 
     city = request.COOKIES['city'].split(",")[0] 
    else: 
     city = '' 
    not_older_than = request.GET.getlist('not_older_than') 
    transmission_type = request.GET.getlist('transmission_type') 
    travel_abroad = request.GET.get('travel_abroad') 
    insurance = request.GET.get('insurance') 
    fuel_type = request.GET.getlist('fuel_type') 
    body_type = request.GET.getlist('body_type') 
    doors = request.GET.getlist('doors') 
    deposit_exists = request.GET.get('deposit_exists') 
    delivery_same_city = request.GET.get('delivery_same_city') 
    day_run_limit_exists = request.GET.get('day_run_limit_exists') 
    seats = request.GET.getlist('seats') 

    if request.user.is_authenticated(): 
     favorite = CarFavorite.objects.filter(user=request.user) 
    else: 
     favorite = [] 

    favorite_user_cars = [] 
    for fav in favorite: 
     favorite_user_cars.append(fav.car.id) 

    q = Q() 
    if city: 
     q &= Q(city__city=city) 
    if not_older_than: 
     qx = Q() 
     for yr in not_older_than: 
      print yr 
      year = str(yr) 
      print year 
      if year == '5': 
       qx |= Q(years__gt=int(date.today().year-5)) 
       print 'yeah yeah 5', int(date.today().year-5) 
      if year == '10': 
       qx |= Q(years__gt=date.today().year-10, years__lt=date.today().year-5) 
       print 'yeah yeah yeah 10' 
      if year == '15': 
       qx |= Q(years__gt=date.today().year-15, years__lt=date.today().year-10) 
      if year == '16': 
       qx |= Q(years__lte=date.today().year-15) 
     q &=qx 
     # q &= Q(city=city) 
    if travel_abroad: 
     if travel_abroad == u'True': 
      q &= Q(travel_abroad=True) 
    if insurance: 
     q &= Q(insurance=insurance) 
    if transmission_type: 
     qx = Q() 
     for transmission in transmission_type: 
      qx |= Q(transmission_type=transmission) 
     q &= qx 
    if fuel_type: 
     qx = Q() 
     for fuel in fuel_type: 
      qx |= Q(fuel_type=fuel) 
     q &= qx 
    if body_type: 
     qx = Q() 
     for body in body_type: 
      qx |= Q(body_type=body) 
     q &= qx 
    if doors: 
     qx = Q() 
     for door in doors: 
      qx |= Q(doors=door) 
     q &= qx 
    if deposit_exists: 
     qx = Q() 
     if str(deposit_exists) == 'False': 
      qx &= Q(deposit_exists=False) 
     q &= qx 
    if delivery_same_city: 
     if delivery_same_city==u'True': 
      q &= Q(do_you_deliver=True) 
    if day_run_limit_exists: 
     if day_run_limit_exists == u'True': 
      q &= Q(day_run_limit_exists=False) 
    if seats: 
     qx = Q() 
     for seat in seats: 
      seat = str(seat) 
      if seat == '2': 
       qx |= Q(seats=2) 
      if seat == '4': 
       qx |= Q(seats__gte=4, seats__lte=5) 
      if seat == '6': 
       qx |= Q(seats__gte=6) 
     q &= qx 


    if 'filter' in request.GET: 
     cars = models.CarForRent.objects.filter(q) 
    elif 'body_type' in request.GET: 
     body_type = request.GET.get('body_type') 
     cars = models.CarForRent.objects.filter(body_type=body_type) 
    else: 
     cars = models.CarForRent.objects.filter(q) 

    car_ratings={} 
    rent_prices={} 


    if 'end_date' in request.COOKIES: 
     total_rent_days = datetime.strptime(request.COOKIES['end_date'], '%Y-%m-%d') - \ 
          datetime.strptime(request.COOKIES['start_date'],'%Y-%m-%d') 
     if total_rent_days.days == 0: 
      total_rent_days = 1 
     else: 
      total_rent_days = total_rent_days.days 
    else: 
     total_rent_days = 1 

    for car in cars: 
     car_rent_prices = models.CarRentPrice.objects.filter(car=car) 
     if car_rent_prices: 
      if car_rent_prices.last().end > total_rent_days: 
       for price in car_rent_prices: 
        if price.start <= total_rent_days <= price.end: 
         rent_prices[car.id] = total_rent_days * price.price 
      else: 
       rent_prices[car.id] = total_rent_days * car_rent_prices.last().price 

     ratings = UserRating.objects.filter(rating_for=car) 
     if len(ratings) > 0: 
      service_rating = 0 
      car_rating = 0 
      how_real_rating = 0 

      for rating in ratings: 
       service_rating += rating.service 
       car_rating += rating.car 
       how_real_rating += rating.how_real 

      total_rating = round(((service_rating/len(ratings)) + (car_rating/len(ratings)) + \ 
       (how_real_rating/len(ratings)))/3.0,1) 

      car_ratings[car.id] = total_rating 
     else: 
      car_ratings[car.id] = 0 

    sorted_by_price = sorted(rent_prices.items(), key=operator.itemgetter(1)) 
    sorted_by_rating = sorted(car_ratings.items(), key=operator.itemgetter(1), reverse=True) 

    if 'sort_by' in request.GET: 
     if request.GET.get('sort_by') == 'price': 
      cars = [] 
      for car_id in sorted_by_price: 
       cars.append(models.CarForRent.objects.get(id=car_id[0])) 
     elif request.GET.get('sort_by') == 'rating': 
      cars = [] 
      for car_id in sorted_by_rating: 
       cars_filter = models.CarForRent.objects.filter(id=car_id[0]) 
       for car in cars_filter: 
        cars.append(car) 
     else: 
      cars = [] 
      for car_id in sorted_by_price: 
       cars.append(models.CarForRent.objects.get(id=car_id[0])) 
    elif 'sort_param' in request.COOKIES: 
     if request.COOKIES['sort_param'] == 'price': 
      cars = [] 
      for car_id in sorted_by_price: 
       cars.append(models.CarForRent.objects.get(id=car_id[0])) 
     elif request.COOKIES['sort_param'] == 'rating': 
      cars = [] 
      for car_id in sorted_by_rating: 
       cars_filter = models.CarForRent.objects.filter(id=car_id[0]) 
       for car in cars_filter: 
        cars.append(car) 
     else: 
      cars = [] 
      for car_id in sorted_by_price: 
       # print car_id[0] 
       cars.append(models.CarForRent.objects.get(id=car_id[0])) 
    else: 
     cars = [] 
     for car_id in sorted_by_price: 
      cars.append(models.CarForRent.objects.get(id=car_id[0])) 

    paginator = Paginator(cars, 10) 

    page = request.GET.get('page') 


    try: 
     cars = paginator.page(page) 
    except PageNotAnInteger: 
     cars = paginator.page(1) 
    except EmptyPage: 
     cars = paginator.page(paginator.num_pages) 

    return render(request, 'cars.html', {'city': city, 'cars': cars, 'favorite_user_cars': favorite_user_cars, 'car_ratings': car_ratings, 'rent_prices': rent_prices, 'rent_days': total_rent_days}) 
+1

聖なる煙.... –

+1

それはかなり悪いです。あなたはリファクタリングし、物事を分解し、掃除しなければなりません。 – masnun

答えて

2

私はこの小さなが

if request.user.is_authenticated(): 
    favorite = CarFavorite.objects.filter(user=request.user) 
else: 
    favorite = [] 

favorite_user_cars = [] 
for fav in favorite: 
    favorite_user_cars.append(fav.car.id) 

から

をリファクタリングを開始する - >

# utils.py 
def _get_favorite_car_ids(user): 
    return list(CarFavorite.objects.filter(user=user).values_list('car_id', flat=True)) if user.is_authenticated() else [] 

# views.py 
favorite_car_ids = _get_favorite_car_ids(request.user) 
関連する問題