Представление модели Django с реляционными данными - PullRequest
0 голосов
/ 23 марта 2019

У меня есть форма модели django, которая создает новое listing в моем приложении post, я хотел бы связать это с идентификатором company, который является типом учетной записи в моем приложении account.

Таблица account_company db (postgresql) имеет поле user_id, которое является pk из User. таблица post_listing будет иметь поле company, которое, я думаю, должно быть pk из account_company.

Поскольку я пытаюсь использовать формы моделей для всех форм, у меня возникла проблема с созданием этой ассоциации.

# models.py

class Listing(models.Model):
   title = models.CharField(max_length=200)
   company = models.ForeignKey(Company, on_delete=models.CASCADE)
   ...
# forms.py

class newListingForm(forms.ModelForm):

    class Meta:
        model = Listing
        fields = ('title'...)

    def __init__(self, user, *args, **kwargs):
        super(newListingForm, self).__init__(*args, **kwargs)
        self.fields['company'].queryset = Company.objects.filter(pk__user_id=user.id) 
    # above i am trying to filter the AutoField to the `company pk` where `user_id` is equal to `request.user.id`
# views.py

def post(request):

    if request.method == 'POST':
        form = newListingForm(request.user, request.POST)
        if form.is_valid():
            listing = form.save(commit=False)
            listing.user = request.user
            listing.save()
    else:
        form = newListingForm(request.user)
    return render(request, 'post/post.html', {'form': form})

Ошибка отладки, которую я получаю:

Unsupported lookup 'user_id' for AutoField or join on the field not permitted.

Обновлено

#accounts model.py

...
class Company(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=200, null=True)
    photo = models.ImageField(upload_to='images/%Y/%m/%d/', null=True)
    description = models.TextField(null=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...