2016-12-05 131 views
0

我有两个名为Event和EventUser的模型。django多对多关系

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正在创建使用事项标识和eventuser_id新表不过,我想使用的用户名,而不是eventuser_id的。或者,如果我可以在我请求时接收用户名而不是id,它可以保持这种状态。

我想说的是:

enter image description here

当我到了用户现场我希望看到的反应,而不是像上面的图像ID的用户名。

+0

您可以发布您的序列化吗? – jape

回答

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: 
     ... 
+0

感谢您的回答,但是,EventUser没有“用户名”,因为它从django的默认用户模型扩展 – cano

+0

@可以对此抱歉,我已经对答案进行了更改。 –

+0

感谢很多人,我只是添加了read_only = true,现在它的工作就像一个魅力:) – cano