2012-07-25 96 views
1

我想知道他們將IntegerField中的列轉換爲外鍵的最佳步驟。這裏是我的兩個型號:將外鍵添加到Django模型

class workout(models.Model): 

    userid = models.IntegerField() 
    datesubmitted = models.DateField() 
    workoutdate = models.DateField(); 
    bodyweight = models.FloatField(null=True); 
    totalreps = models.IntegerField() 
    totalweight = models.FloatField() 
    numsets = models.IntegerField(); 
    numexercises = models.IntegerField() 
    workoutname = models.CharField(max_length=250) 

,第二個:

class exercise(models.Model): 
    userid = models.IntegerField(); 
    workoutid = models.IntegerField(); 
    exercisename = models.CharField(max_length = 100) 
    repetitions = models.IntegerField() 
    weight = models.FloatField() 

,最後我的Django視圖代碼:

user =User.objects.get(username = request.session['username']) #user 
     dates = request.GET.getlist('datepickerfilter') # two dates 
     workout_ids = workout.objects.filter(userid=user.id).filter(workoutdate__gte = dates[0]).filter(workoutdate__lte = dates[1]) 
     all_exercises = exercise.objects.filter(workoutid__in = workout_ids) 

我想更改的 'workoutid' 列鍛鍊模型到與鍛鍊模型中的id字段相關的外鍵。我想這改變改變模型領域:

workoutid = models.ForeignKey(workout); 

,然後在我的視圖中添加這個這個ORDER_BY聲明all_exercises年底即

all_exercises = exercise.objects.filter(workoutid__in = workout_ids).order_by("workoutid__workoutdate") 

我得到一個錯誤說:

(1054, "Unknown column 'tracking_exercise.workoutid_id' in 'field list'") 

我認爲這是我的模型代碼中的一個問題,但我不確定這可能是視圖問題。

感謝您的幫助!

回答

1

您正在收到錯誤消息,因爲workout_ids不是ID列表。

一個快速和簡單的解決您目前的問題是使用.values_list('id', flat=True)像這樣:

workout_ids = workout.objects.filter(userid=user.id).\ 
    filter(workoutdate__gte=dates[0]).\ 
    filter(workoutdate__lte=dates[1]).\ 
    values_list('id', flat=True) 

不過,我會強烈建議使用models.ForeignKey。這裏有一個簡單的例子,讓你開始:

class Workout: 
    user = models.ForeignKey(User) 
    # other fields go here... 

class Exercise: 
    workout = models.ForeignKey(Workout) 
    # other fields go here... 

然後你可以編寫查詢:

workout_list = Workout.objects.filter(user=request.user) 
exercise_list = Exercise.objects.filter(workout__in=workout_list).order_by('workout__workoutdate') 
+0

我一定要改變我的兩個表,並添加這些列? – 2012-07-25 01:27:55

+1

您不必更改基礎SQL表。你可以這樣做:'userid = models.IntegerField()'到'user = models.ForeignKey(User,db_column ='userid')''。 – 2012-07-25 01:32:03

+0

好吧,一切工作正常,除了這一件事,它不喜歡order_by(workout__workoutdate)。它說沒有一個全球性的名字'workout__workoutdate'沒有定義 – 2012-07-25 01:55:56