django很多很多关系

时间:2016-12-05 19:52:41

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

我有两个名为Event和EventUser的模型。

class EventUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        u = User.objects.get(pk=self.user_id)
        return u.username

class Event(models.Model):
    EVENT_TYPE_CHOICES = (
        (1, 'Food & Beverage'),
        (2, 'Party'),
        (3, 'Natural'),
        (4, 'Historical'),
        (5, 'Educational'),
        (6, 'Sportive'),
    )
    name = models.CharField(max_length=50)
    event_type = models.IntegerField(choices=EVENT_TYPE_CHOICES)
    date_time = models.DateTimeField()
    location = models.CharField(max_length=255)
    creator = models.ManyToManyField(User, related_name='event_creator')
    info = models.CharField(max_length=255, default='')
    users = models.ManyToManyField(EventUser, blank=True)

    def __str__(self):
        return self.name

因此,很自然ManyToManyField正在使用event_id和eventuser_id创建新表,但是,我想使用用户名而不是eventuser_id。或者,如果我在请求时可以接收用户名而不是id,则可以保持这种状态。

我想说的是;

enter image description here

当我获得用户字段时,我希望在响应时看到用户名,而不是像上面的图像那样的ids。

1 个答案:

答案 0 :(得分:0)

您可以使用CustomRelationalField来显示用户名而不是ID,如下所示:

class UserListingField(serializers.RelatedField):

    def to_representation(self, value):
        return '{}'.format(value.user.username)

    def to_internal_value(self, value):
        # assumption, value is id of EventUser
        return value

class YourSerializer(serializers.ModelSerializer):
    users = UserListingField(many=True)

    class Meta:
        ...