Django REST中的动态表单字段

时间:2019-06-20 13:42:38

标签: django django-models django-rest-framework django-forms

我正在尝试创建一个表单,用户可以在其中创建博客。该表格将具有标题,一对多作者和内容。对于作者而言,我想有一个输入自动完成搜索框(例如stackoverflow的标签搜索框),它将作者添加到博客中。我知道如何创建前端外观,但是就使用Django的REST框架在模型中添加作者而言,我不知道该怎么做。

型号:

x = pd.to_datetime(df['CloseTime']).dt.time.astype(str)
y = df['Time'].astype(str)
# convert `x` and `y` to `timedelta`, then subtract
df['diff'] = pd.Series.sub(*map(pd.to_timedelta, (x, y)))
df

        Time            CloseTime     diff
17  09:30:00  2019-04-22 09:32:00 00:02:00
27  09:30:00  2019-05-13 09:32:00 00:02:00
36  09:30:00             15:15:00 05:45:00
37  09:30:00             15:15:00 05:45:00
44  09:30:00  2019-05-24 09:32:00 00:02:00
76  09:30:00  2019-06-07 09:32:00 00:02:00
92  09:30:00  2019-06-17 09:32:00 00:02:00

如何从输入中遍历每个添加的作者并将其添加到StoryAuthor模型中?因此,例如,一个故事应如下所示:

class Story(models.Model):
    title       = models.CharField(max_length=100, null=False)
    content     = models.TextField()
    created_at  = models.DateField(auto_now_add=True)


class StoryAuthor(models.Model):
    story   = models.ForeignKey(Story, on_delete=models.CASCADE)
    user    = models.ForeignKey(User, on_delete=models.CASCADE)

就输入框而言,数据应如下所示:“ John,Jack,Brad”如何使用Django的REST来拥有可以执行此操作的序列化器/端点?

1 个答案:

答案 0 :(得分:1)

假设您正在使用Serializers,下面是解决方法。

只需在您的Story模型中添加ManyToMany Field

class Story(models.Model):
    title       = models.CharField(max_length=100, null=False)
    content     = models.TextField()
    created_at  = models.DateField(auto_now_add=True)
    #new field
    authors = models.ManyToManyField(User, through='StoryAuthor')

然后在您的序列化程序中,将作者字段添加到序列化程序(CustomSerialzer)并编写用户序列化程序(如果您还没有的话):

class UserSerializer(serializers.Serializer):
    username = serializers.CharField(max_length=100)

class StorySerializer(serializers.ModelSerializer):
    authors = UserSerializer(read_only=True, many=True)

    class Meta:
        ...

注意: 如果您不打算在StoryAuthor中添加额外的字段,则无需自己编写StoryAuthor类。只需在Story类中添加authors字段而不使用'through'参数,Django的ORM将处理数据透视表。