2012-07-25 126 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