【问题标题】:Django - Using TimeField() as a foreign keyDjango - 使用 TimeField() 作为外键
【发布时间】:2020-07-12 21:30:27
【问题描述】:

我有一个 Meeting 模型,它的 meeting_hourMeetingHour 模型中获取其值。但是提交表单后出现如下错误:

Cannot assign "datetime.time(14, 0)": "Meeting.meeting_hour" must be a "MeetingHour" instance.

我知道它是因为我没有正确使用MeetingHour 作为外键,但不知道如何修复它。这是我的代码:

models.py

class MeetingHour(models.Model):
    hour = models.TimeField()

    def __str__(self):
        return self.hour

class Meeting(models.Model):
    participant_name = models.CharField(max_length=50)
    participant_email = models.EmailField(max_length=50)
    meeting_date = models.DateField()
    meeting_hour = models.ForeignKey(MeetingHour, on_delete = models.CASCADE)
    is_scheduled = models.BooleanField(default=False)

    def __str__(self):
        return self.participant_name

views.py

def index(request):
    context = {
        'schedules': Meeting.objects.all()
    }
    if request.method == "POST":
        participant_name = request.POST.get('name')
        participant_email = request.POST.get('email')
        meeting_date = str(request.POST.get('date'))
        meeting_hour = str(request.POST.get('hour'))
        converted_meeting_date = datetime.strptime(request.POST.get('date'), "%Y-%m-%d").date() if meeting_date else None
        converted_meeting_hour = datetime.strptime(request.POST.get('hour'), "%H:%M").time() if meeting_hour else None
        subject = 'Meeting'
        message = f'Hi, {participant_name} ! \nYour meeting date: {meeting_date}, hour: {meeting_hour}'
        from_email = settings.SERVER_EMAIL
        recipient_list = [participant_email]
        send_mail(subject, message, from_email, recipient_list)
        if request.POST.get('email'):
            Meeting.objects.create(
                participant_name = request.POST.get('name'),
                participant_email = request.POST.get('email'),
                meeting_date = converted_meeting_date,
                meeting_hour = converted_meeting_hour,
                is_scheduled = True
            )
    return render(request, 'index.html', context)

【问题讨论】:

  • 你必须先创建一个MeetingHour的实例,然后分配给Meeting.meeting_hour

标签: python django django-models django-forms django-views


【解决方案1】:

您需要使用MeetingHour 实例作为外键。此外,您必须在致电send_email 之前检查email


def index(request):
    context = {
        'schedules': Meeting.objects.all()
    }
    if request.method == "POST" and request.POST.get('email'):
        participant_name = request.POST.get('name')
        participant_email = request.POST.get('email')
        meeting_date = str(request.POST.get('date'))
        meeting_hour = str(request.POST.get('hour'))
        converted_meeting_date = datetime.strptime(request.POST.get('date'), "%Y-%m-%d").date() if meeting_date else None
        converted_meeting_hour = datetime.strptime(request.POST.get('hour'), "%H:%M").time() if meeting_hour else None
        subject = 'Meeting'
        message = f'Hi, {participant_name} ! \nYour meeting date: {meeting_date}, hour: {meeting_hour}'
        from_email = settings.SERVER_EMAIL
        recipient_list = [participant_email]
        send_mail(subject, message, from_email, recipient_list)
        hour, _ = MeetingHour.objects.get_or_create(hour = converted_meeting_hour)
        Meeting.objects.create(
            participant_name = request.POST.get('name'),
            participant_email = request.POST.get('email'),
            meeting_date = converted_meeting_date,
            meeting_hour = hour,
            is_scheduled = True
        )
    return render(request, 'index.html', context)

【讨论】:

  • 伙计,但是否可以在不创建 MeetinHour 的实例的情况下做到这一点?因为我有固定的会议时间,比如每天只有 14:00 和 15:00
  • 是的,删除 MeetingHour 模型并将字段设置为 ChoiceField 并选择您的可用时间。
  • @suhailvs,伙计,你好,祝你有美好的一天。你能检查一下我的这个问题stackoverflow.com/questions/61156491/… 吗?最近几天,我的问题很少有人问,而且无法标记某人。请帮帮我。
【解决方案2】:

由于meeting_hour 是您的MeetingHour 模型的ForeignKey,因此您必须从MeetingHour 表中获取一个对象并将其保存到您的Meeting 模型的meeting_hour 字段中。

例如:

meeting_hour = MeetingHour.objects.get(hour=converted_meeting_hour)

Meeting.objects.create(..., .., .., meeting_hour=meeting_hour)

如果您从数据库的角度考虑,Meeting 模型中的meeting_hour 字段只是MeetingHour 字段的id。这意味着 Django 需要通过对象实例或 id 对该字段的实际引用,以便在数据库中存储正确的值。

【讨论】:

  • 伙计,你好,祝你有美好的一天。你能检查一下我的这个问题stackoverflow.com/questions/61156491/… 吗?最近几天,我的问题很少有人问,而且无法标记某人。请帮帮我。
猜你喜欢
  • 2020-05-20
  • 2014-10-02
  • 2012-02-11
  • 2017-08-17
  • 2016-04-02
  • 2018-07-04
  • 1970-01-01
  • 2014-09-07
  • 2016-04-05
相关资源
最近更新 更多