包括其他字段作为外键Django的选择

时间:2017-05-11 04:22:42

标签: python django django-models foreign-keys

我有两个模型如下:

class FlightSchedule(models.Model):
    tail_number = models.ForeignKey(TailNumber, null=False, blank=False)
    flight_number = models.CharField(max_length=30, null=False, blank=False)
    flight_group_code = models.ForeignKey(FlightGroup, null=False, blank=False)
    origin_port_code = models.ForeignKey(Port, null=False, related_name="Origin", blank=False)
    destination_port_code = models.ForeignKey(Port, null=False, related_name="Destination", blank=False)
    flight_departure_time = models.TimeField()
    start_date = models.DateField()
    end_date = models.DateField()

    def __unicode__(self):
        return u'%s' % self.flight_number

    class Meta:
        verbose_name_plural = "flights Schedule"


class PosFlightSchedule(models.Model):
    tail_number = models.ForeignKey(TailNumber, null=False, blank=False)
    pos_flight_number = models.ForeignKey(FlightSchedule, max_length=30, null=False, blank=False,
                                      related_name='pos_flight_number')
    pos_flight_departure_time = models.ForeignKey(FlightSchedule, max_length=30,
                                              related_name='pos_flight_departure_time')
    pos_route_id = models.ForeignKey(FlightScheduleDetail, null=False, blank=False, related_name='pos_route_id')
    pos_flight_date = models.ForeignKey(FlightScheduleDetail, null=False, blank=False, related_name='pos_flight_date')
    pax_count = models.IntegerField(null=True)

    def __unicode__(self):
        return u'%s' % self.pos_flight_number

    class Meta:
        verbose_name_plural = "Flights Schedule"

对于pos_flight_departure_time,我需要来自flight_departure_time课程的FlightSchedule选项。但我在下拉列表中得到flight_number值。我需要更改什么才能获得flight_departure_time值?这些课程来自单个django项目中的不同应用程序。所以他们有两个管理文件。

2 个答案:

答案 0 :(得分:1)

不,你真的不需要那个。您的第二个模型中只需要一个外键到FlightScheduleDetail,而您只需要一个外键FlightSchedule

class PosFlightSchedule(models.Model):
    tail_number = models.ForeignKey(TailNumber, null=False, blank=False)
    flight = models.ForeignKey(FlightSchedule, null=False, blank=False,related_name='pos_flight_number')
                                              related_name='pos_flight_departure_time')
    pos_route_id = models.ForeignKey(FlightScheduleDetail, null=False, blank=False, related_name='pos_route_id')
            pax_count = models.IntegerField(null=True)

    def __unicode__(self):
        return u'%s' % self.pos_flight_number

    class Meta:
        verbose_name_plural = "Flights Schedule"

然后,第一个模型中声明的所有字段将自动变为PosFlightSchedule

所以例如你可以做

p = PosFlightSchedule.objects.all()[0]
print (p.flight.flight_number)
print (p.flight.pos_flight_departure_time)

等。

这是正确的方法。

答案 1 :(得分:0)

您可以通过定义模型表单,而不是更改为models.py

来解决此问题
class PosFlightScheduleForm(forms.ModelForm):
    pos_flight_departure_time = forms.ChoiceField(label="Pos Department Time",
                                   choices=[(i.pk, i.flight_departure_time) for i in FlightSchedule.objects.all()],
                                   required=True)


    def __init__(self, *args, **kwargs):
        super(PosFlightScheduleForm, self).__init__(*args, **kwargs)
        self.fields['pos_flight_departure_time'] = forms.ChoiceField(label="Pos Department Time",
                                   choices=[(i.pk, i.flight_departure_time) for i in FlightSchedule.objects.all()],
                                   required=False)


    class Meta:
        model = PosFlightSchedule
        fields = (
            "tail_number", 'pos_flight_departure_time',)

在view.py中您可以使用此表单

def add_view(self, request):
    form = PosFlightScheduleForm(request.POST or None)

    if form.is_valid():
        form.save()                                    
        return redirect('/postflights')
    context = {
        'form': form,
    }
    return render(request, 'path/form.html', context)